繁体   English   中英

IdentityDbContext用户DbSet名称

[英]IdentityDbContext User DbSet Name

我创建了一个从IdentityUser继承的自定义用户,称为Contacts,而我的应用程序dbcontext则从IdentityDbContext继承,如下所示:

public class Contact : IdentityUser<int, ContactLogin, ContactRole, ContactClaim>
{
    public Contact()
    {            
    }
}

public class dbcontext : IdentityDbContext<Contact, Role, int, ContactLogin, ContactRole, ContactClaim>
{
    public dbcontext()
        : base("dbcontext")
    {
    }        


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // IdentityDbContext base - must be called prior to changing identity configuration
        base.OnModelCreating(modelBuilder);

        // custom identity table names and primary key column Id names
        modelBuilder.Entity<Contact>().ToTable("Contacts").Property(p => p.Id).HasColumnName("ContactId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<ContactRole>().ToTable("ContactRoles");
        modelBuilder.Entity<ContactLogin>().ToTable("ContactLogins");
        modelBuilder.Entity<ContactClaim>().ToTable("ContactClaims").Property(p => p.Id).HasColumnName("ContactClaimId");
        modelBuilder.Entity<Role>().ToTable("Roles").Property(p => p.Id).HasColumnName("RoleId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

默认情况下,IdentityDbContext包含一个用户DbSet。 是否可以更改此DbSet的名称以匹配其实现的类型,例如“联系人”?

没什么大不了的,但是使用dbcontext.Contacts而不是dbcontext.Users引用DbSet会很好。

谢谢。

基本IdentityDbContext使用: public virtual IDbSet<TUser> Users { get; set; } public virtual IDbSet<TUser> Users { get; set; } public virtual IDbSet<TUser> Users { get; set; }以暴露用户DbSet。

您需要为自己的实现使用类似的属性,例如: public IDbSet<Contacts> Contacts { get; set; } public IDbSet<Contacts> Contacts { get; set; }

更新资料

问题是有关将现有的DbSet联系人从用户重命名为Contacts。

不,您不能开箱即用。 您可以尝试将其包装并再次公开,但这并不是正确的选择。 请参阅此问题进行深入讨论

请注意,如果您决定覆盖任何内容或添加自己的内容,则UserStore的默认EF实现将使用名为Users的DbSet。 如果发生意外行为,请注意。

通常,我倾向于做的是将关注点分离得很大。

所以我有:

public IDbSet<User> Users { get; set; }

这代表任何想要登录我的系统的人。 因此,现在我想将实际概念建模到我的数据库中,这些概念与现实世界中的事物相关。 例如,我有一个系统管理员,我将为此创建一个实体。

public class SystemAdministrator
{
   public string Name { get; set; }

   public int LocationId { get; set; } // a complex representation of where this administrator works from

   public int UserId { get; set; } // this is now a reference to their log in
}

现在我的上下文将如下所示:

public IDbSet<User> Users { get; set; }

public DbSet<SystemAdministrator> SystemAdministrators { get; set; } // I use DbSet because it exposes more methods to use like AddRange.

这意味着现在我的数据库可以正确代表现实世界的概念,每个人都可以轻松地进行开发。 我对ClientsEmployees

这也意味着我可以摆脱原始的迷恋

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM