【问题标题】:Issues with DbContexts causing Errors导致错误的 DbContexts 问题
【发布时间】:2018-09-30 22:41:25
【问题描述】:

我目前有多个具有多个 DbContext 的项目:

项目(DbContext):

  • 型号
  • DataAccessLayer (EntityContext)
  • 服务层
  • 网页(IdentityContext)

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

当 IdentityContext 尝试创建 AspNet 表时,它还尝试重新创建部门表,我收到以下错误:

“数据库中已经有一个名为‘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; }”,现在它构建了,但是当我尝试访问它时,我得到了这个错误:

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

我理解这两个错误,但我不知道如何让它们处于相同的上下文中,因为它们位于不同的项目中。

【问题讨论】:

标签: c# entity-framework asp.net-identity


【解决方案1】:

传统上,在这种情况下,我宁愿您将 DataAccessLayer 中的 Context 设置为 IdentityContext。由于无论如何您在 IdentityContext 和该特定上下文之间都有联系,因此它为您提供了一个表示您的应用程序的上下文,并且不会引入共享上下文问题。

这将导致从您的 Web 项目中删除 DBContext,并将 DataAccessLayer 内的 Context 的基类更改为 IdentityDbContext&lt;ApplicationUser&gt; 而不是当前的 DbContext 基类。

这很可能会导致您将一些实体移动到较低的 DLL 中,但它再次使该 DLL 更能代表整个解决方案。

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 2022-01-23
    • 2014-10-23
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多