C# 我可以在同一个项目中有多个DBContext吗
在我们的项目中,我们的代码优先数据库有一个DbContext,它运行良好。我创建了第二个DbContext(AppDbContext)来封装登录信息。它将指向同一个数据库,但不需要查看所有表,也不需要迁移 当标识系统在“我的用户管理器”中初始化此上下文时:C# 我可以在同一个项目中有多个DBContext吗,c#,entity-framework,C#,Entity Framework,在我们的项目中,我们的代码优先数据库有一个DbContext,它运行良好。我创建了第二个DbContext(AppDbContext)来封装登录信息。它将指向同一个数据库,但不需要查看所有表,也不需要迁移 当标识系统在“我的用户管理器”中初始化此上下文时: var manager = new MkpUserManager(new UserStore<MkpUser, MkpRole, Guid, MkpLogin, MkpUserRole, MkpClaim>(context.Ge
var manager = new MkpUserManager(new UserStore<MkpUser, MkpRole, Guid, MkpLogin, MkpUserRole, MkpClaim>(context.Get<AppDbContext>()));
var-manager=newmkpusermanager(newuserstore(context.Get());
我得到一个错误:
无法确定类型“PublicationSystem.Model.Organization”和“PublicationSystem.Model.Resource”之间关联的主体端。必须使用关系fluent API或数据注释显式配置此关联的主体端
AppDbContext不应处理这两个表。我怎样才能让它忽略它们呢?拥有两个DbContext文件是否可行
以下是AppDbContext的外观:
public class AppDbContext : IdentityDbContext<MkpUser, MkpRole, Guid, MkpLogin, MkpUserRole, MkpClaim>
{
#region Constructors
public AppDbContext()
: base("IdentityConnection")
{
}
#endregion
#region Methods
public static AppDbContext Create()
{
return new AppDbContext();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// Map Entities to their tables.
modelBuilder.Entity<MkpUser>().ToTable("User");
modelBuilder.Entity<MkpRole>().ToTable("Role");
modelBuilder.Entity<MkpClaim>().ToTable("UserClaim");
modelBuilder.Entity<MkpLogin>().ToTable("UserLogin");
modelBuilder.Entity<MkpUserRole>().ToTable("UserRole");
// Set AutoIncrement-Properties
modelBuilder.Entity<MkpUser>().Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<MkpClaim>().Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<MkpRole>().Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Override some column mappings that do not match our default
modelBuilder.Entity<MkpUser>().Property(r => r.UserName).HasColumnName("Email");
modelBuilder.Entity<MkpUser>().Property(r => r.PasswordHash).HasColumnName("Password");
}
#endregion
}
公共类AppDbContext:IdentityDbContext
{
#区域构造函数
公共AppDbContext()
:base(“IdentityConnection”)
{
}
#端区
#区域方法
公共静态AppDbContext Create()
{
返回新的AppDbContext();
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
//将实体映射到它们的表。
modelBuilder.Entity().ToTable(“用户”);
modelBuilder.Entity().ToTable(“角色”);
modelBuilder.Entity().ToTable(“UserClaim”);
modelBuilder.Entity().ToTable(“UserLogin”);
modelBuilder.Entity().ToTable(“UserRole”);
//设置自动增量属性
modelBuilder.Entity().Property(r=>r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(r=>r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity().Property(r=>r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
//重写与默认值不匹配的某些列映射
modelBuilder.Entity().Property(r=>r.UserName).HasColumnName(“电子邮件”);
modelBuilder.Entity().Property(r=>r.PasswordHash).HasColumnName(“密码”);
}
#端区
}
每个项目/解决方案可以有多个上下文,没有任何问题。我经常这样做。然而,我认为将两个上下文指向同一个数据库不是一个好主意
您将遇到以下问题:
-谁负责更新数据库的模式?
-如果使用代码优先迁移,则两个DB只需使用一个_MigrationHistory表。在我看来,未来的问题很奇怪
我认为,通过将两个上下文指向同一个DB,你1/承担了许多不必要的风险,2/没有遵循EF的预期用途。使用ASP.NET identity(推荐的方法)时,似乎有一个单独的DB(或他们称之为存储)来管理身份验证
您将有一个用于身份验证的存储(在这里您将存储用户的密码),您将有一个用于授权的DB,其中还包含所有业务数据。例如,两者之间的链接可以是电子邮件地址
您可以在身份验证数据库中查找该用户,如果可以,您可以让他登录并使用主数据库执行常见的业务任务。要快速修复您的设计,只需更改包含登录信息的数据库的连接字符串。这是一个不确定的事实,您试图包含的实体是否引用了这些类(组织和资源)?不。到目前为止,它们还没有。我很想看一个示例,说明如何使用两个数据库。我还想过简单地将标识表包含在与DB其余部分相同的DbContext中。我想将身份映射到我们现有的模式。但是,我们的用户数据存储在多个表中,我找不到一个标识处理该场景的示例。我同意你的看法,我也在寻找一个ASP.NET标识与单个数据库一起使用的示例,但找不到一个。因此,我假设,在所有这些OWIN认证趋势下,新标准是将认证机制解耦。但我完全理解你想做什么,以及为什么诚实是绝对相关的。我将编辑我的答案以提供一个示例