Code First Migration想要为不同的DbContext中的一个实体创建表格
问题描述:
假设我有3个实体:A,B和C;Code First Migration想要为不同的DbContext中的一个实体创建表格
public class A // Target entity
{
public int Foo { get; set; }
public int Bar { get; set; }
}
public class B
{
public virtual ICollection<C> C { get; set; } // Navigation to C
}
public class C
{
public virtual A A { get; set; } // Navigation to A
}
...和目前单一上下文:X
public abstract class Context : DbContext
{
protected const string CONNECTION_NAME = "some_connection_name";
protected const string SCHEMA_NAME = "dbo";
public Context() : base(CONNECTION_NAME)
{
Database.Log = message => Debug.WriteLine(message);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(SCHEMA_NAME);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
}
}
public class X : Context
{
public DbSet<A> A { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AConfiguration());
base.OnModelCreating(modelBuilder);
}
}
的问题是,我通过导航属性添加第二上下文(Y),因此该实体Ç指向一个,Code First Migrations
想要为实体A创建一个表,但它已经存在。
public class Y : Context
{
public DbSet<B> B { get; set; }
public DbSet<C> C { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BConfiguration());
modelBuilder.Configurations.Add(new CConfiguration());
base.OnModelCreating(modelBuilder);
}
}
我该如何克服这个问题?
答
第二方面应该明确Ignore的A
实体:
public class Y : Context
{
public DbSet<B> B { get; set; }
public DbSet<C> C { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BConfiguration());
modelBuilder.Configurations.Add(new CConfiguration());
modelBuilder.Ignore<A>();
base.OnModelCreating(modelBuilder);
}
}
是否有这样一个简单的方法,因为更多的实体(不同的上下文中的导航属性的实体)的依赖性增加,更大是头痛。 –
不是我所知道的。我总是尽量让属于不同情境的班级模特彼此分开。当我需要多个上下文中的实体时,我宁愿复制类,而不是重用类(例如:核心业务上下文中的'User'实体和授权上下文中的'AuthorizationUser'实体,它们都只具有它们需要的关联应用程序的特定聚合,但映射到同一个表)。 –