我目前有多个项目有多个DbContexts:
项目(DbContext):
我在模型的项目中有一个名为Department的模型,它由EntityContext创建,我在Web项目的ApplicationUser.cs中引用它。
当IdentityContext尝试创建AspNet表时,它还会尝试重新创建部门表,我收到以下错误:
"已有一个名为“部门”的对象'在数据库中。"
这是我的身份档案:
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; }
}
然后我评论了公共DbSet部门{get;组; }&#34;在EntityContext中,现在它构建但是当我尝试访问它时,我收到此错误:
&#34;实体类型部门不是当前上下文模型的一部分。&#34;
我理解这两个错误,但我无法弄清楚如何让它们处于相同的环境中,就像它们在不同的项目中一样。
答案 0 :(得分:0)
传统上在这样的情况下,我宁愿让你的Context在DataAccessLayer中成为IdentityContext。由于您无论如何都要在IdentityContext和特定上下文之间建立联系,因此它为您提供了表示应用程序的单个上下文,并且不会引入共享上下文问题。
这将导致从Web项目中删除DBContext,并将DataAccessLayer中的Context的基类更改为IdentityDbContext<ApplicationUser>
而不是当前的DbContext基类。
最有可能的是,这会导致您将一些实体移动到较低的DLL中,但同样会使该DLL更能代表整个解决方案。