IdentityDbContext用户DbSet名称

时间:2015-08-21 00:30:13

标签: c# entity-framework asp.net-identity

我创建了一个继承自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包含Users DbSet。是否可以更改此DbSet的名称以匹配其实现的类型,例如Contacts?

这不是什么大问题,但使用dbcontext.Contacts而不是dbcontext.Users来引用DbSet会很不错。

感谢。

2 个答案:

答案 0 :(得分:0)

基础IdentityDbContext使用:public virtual IDbSet<TUser> Users { get; set; }来公开用户DbSet。

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

更新

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

不,你不能开箱即用。您可以尝试将其包装并再次展开,但这不是正确的做法。请参阅this question for an in depth discussion

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

答案 1 :(得分:0)

一般来说,我倾向于将关注点分开。

所以我有:

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也这样做。

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