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 包含一个 Users DbSet。是否可以更改此 DbSet 的名称以匹配它正在实现的类型,例如联系人?
这没什么大不了的,但是使用 dbcontext.Contacts 而不是 dbcontext.Users 来引用 DbSet 会更好。
谢谢。
基础 IdentityDbContext
使用:public virtual IDbSet<TUser> Users { get; set; }
公开用户 DbSet。
您需要类似的 属性 用于您自己的实施,例如:public IDbSet<Contacts> Contacts { get; set; }
更新
问题是关于将现有的联系人数据库集从用户重命名为联系人。
不,您不能开箱即用。您可以尝试将其包裹起来并再次暴露,但这并不是真正正确的做法。参见 this question for an in depth discussion。
请注意,如果您决定覆盖任何内容或添加您自己的内容,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.
这意味着我的数据库现在可以正确表示现实世界的概念,每个人都可以轻松地进行开发。我对 Clients
或 Employees
.
做同样的事情
这也意味着我可以摆脱原始的痴迷
我创建了一个继承自 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.Contacts 而不是 dbcontext.Users 来引用 DbSet 会更好。
谢谢。
基础 IdentityDbContext
使用:public virtual IDbSet<TUser> Users { get; set; }
公开用户 DbSet。
您需要类似的 属性 用于您自己的实施,例如:public IDbSet<Contacts> Contacts { get; set; }
更新
问题是关于将现有的联系人数据库集从用户重命名为联系人。
不,您不能开箱即用。您可以尝试将其包裹起来并再次暴露,但这并不是真正正确的做法。参见 this question for an in depth discussion。
请注意,如果您决定覆盖任何内容或添加您自己的内容,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.
这意味着我的数据库现在可以正确表示现实世界的概念,每个人都可以轻松地进行开发。我对 Clients
或 Employees
.
这也意味着我可以摆脱原始的痴迷