2017-10-17 221 views
0

假设我有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); 
    } 
} 

我该如何克服这个问题?

回答

0

第二方面应该明确IgnoreA实体:

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); 
    } 
} 
+0

是否有这样一个简单的方法,因为更多的实体(不同的上下文中的导航属性的实体)的依赖性增加,更大是头痛。 –

+0

不是我所知道的。我总是尽量让属于不同情境的班级模特彼此分开。当我需要多个上下文中的实体时,我宁愿复制类,而不是重用类(例如:核心业务上下文中的'User'实体和授权上下文中的'AuthorizationUser'实体,它们都只具有它们需要的关联应用程序的特定聚合,但映射到同一个表)。 –

相关问题