Code First Migration希望[重新]为不同DbContext内的一个实体创建表

时间:2017-10-17 18:40:36

标签: c# entity-framework dbcontext ef-migrations

假设我有3个实体:A,B和C;

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),因此实体C通过导航属性指向A,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);
    }
}

我怎样才能克服这个?

1 个答案:

答案 0 :(得分:0)

第二个上下文应明确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);
    }
}