Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在同一个项目中有多个DBContext吗_C#_Entity Framework - Fatal编程技术网

C# 我可以在同一个项目中有多个DBContext吗

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

在我们的项目中,我们的代码优先数据库有一个DbContext,它运行良好。我创建了第二个DbContext(AppDbContext)来封装登录信息。它将指向同一个数据库,但不需要查看所有表,也不需要迁移

当标识系统在“我的用户管理器”中初始化此上下文时:

 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认证趋势下,新标准是将认证机制解耦。但我完全理解你想做什么,以及为什么诚实是绝对相关的。我将编辑我的答案以提供一个示例