首页 文章

DbContexts导致错误的问题

提问于
浏览
0

我目前有多个项目有多个DbContexts:

项目(DbContext):

  • 型号

  • DataAccessLayer(EntityContext)

  • ServiceLayer

  • Web(IdentityContext)

我在模型的项目中有一个名为Department的模型,它由EntityContext创建,我在Web项目的ApplicationUser.cs中引用它 .

当IdentityContext尝试创建AspNet表时,它还会尝试重新创建Department Table,并且我收到以下错误:

“数据库中已有一个名为'Departments'的对象 . ”

这是我的身份文件:

IdentityContext是我的Web项目:
ApplicationDbContext.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("EntityContext", throwIfV1Schema: false)
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.AutoDetectChangesEnabled = false;
        Configuration.ProxyCreationEnabled = false;
        Configuration.ValidateOnSaveEnabled = false;
    }

    static ApplicationDbContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, ApplicationDbInitializer>());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

ApplicationDbInitializer.cs

public class ApplicationDbInitializer : DbMigrationsConfiguration<ApplicationDbContext>
{
    public ApplicationDbInitializer()
    {
        AutomaticMigrationsEnabled = false;

        #if DEBUG
        AutomaticMigrationDataLossAllowed = true;
        AutomaticMigrationsEnabled = true;
        #endif
    }

    protected override void Seed(ApplicationDbContext context)
    {
        base.Seed(context);
    }

ApplicationUser.cs

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        return userIdentity;
    }

    /// <summary>
    /// Linked Department Id
    /// </summary>
    public Guid? DepartmentId { get; set; }

    /// <summary>
    /// Linked Department Object
    /// </summary>
    [ForeignKey("DepartmentId")]
    public virtual Department Department { get; set; }
}

然后我在EntityContext中注释掉了“public DbSet Department {get; set;}”,现在它构建了,但是当我尝试访问它时,我得到了这个错误:

“实体类型部门不是当前上下文模型的一部分 . ”

我理解这两个错误,但我无法弄清楚如何让它们处于相同的上下文中,就像它们在不同的项目中一样 .

1 回答

  • 0

    传统上在这样的情况下,我宁愿你在DataAccessLayer中使你的Context成为IdentityContext . 由于您无论如何都要在IdentityContext和特定上下文之间 Build 联系,因此它为您提供了表示应用程序的单个上下文,并且不会引入共享上下文问题 .

    这将导致从Web项目中删除DBContext,并将DataAccessLayer中的Context的基类更改为 IdentityDbContext<ApplicationUser> 而不是当前的DbContext基类 .

    最有可能的是,这会导致您将一些实体移动到较低的DLL中,但同样会使该DLL更能代表整个解决方案 .

相关问题