IdentityDbContext用户DbSet名称

本文关键字:名称 DbSet 用户 IdentityDbContext | 更新日期: 2023-09-27 18:09:12

我已经创建了一个自定义用户从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的名称来匹配它正在实现的类型,例如联系人?

这不是什么大问题,但是使用dbcontext引用DbSet会很好。联系人而不是dbcontext.Users。

谢谢。

IdentityDbContext用户DbSet名称

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

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

更新

问题是关于将现有的DbSet的联系人从Users重命名为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做同样的处理。

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