我目前有多个具有多个 DbContext 的项目:
项目(数据库上下文):
- 型
- 数据访问层(实体上下文)
- 服务层
- Web (IdentityContext)
我在模型的项目中有一个名为 Department 的模型,它由 EntityContext 创建,我在 WebProject 的 ApplicationUser .cs 中引用了它。
当 IdentityContext 尝试创建 AspNet 表时,它也尝试重新创建部门表,我收到以下错误:
"数据库中已经有一个名为'部门'的对象。
这是我的身份文件:
IdentityContext 是我的 Web Project:
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);
}
应用程序用户.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; }
}
然后我注释掉了"公共数据库集部门{得到;设置;}",现在它构建了,但是当我尝试访问它时,我收到此错误:
"实体类型"部门"不是当前上下文模型的一部分。"
我理解这两个错误,但我无法弄清楚如何让它们处于相同的上下文中,因为它们在不同的项目中。
传统上,在这种情况下,我宁愿你让DataAccessLayer内部的上下文成为IdentityContext。 由于无论如何,IdentityContext 和该特定上下文之间存在联系,因此它为您提供了表示应用程序的单个上下文,并且不会引入共享上下文问题。
这将导致从 Web 项目中删除 DBContext,并将 DataAccessLayer 中上下文的基类更改为IdentityDbContext<ApplicationUser>
而不是当前的 DbContext 基类。
最有可能的是,这将导致您将一些实体移动到较低的 DLL 中,但它再次使该 DLL 更能代表整个解决方案。