实体类型不能共享表|实际上并不是同一张桌子

时间:2017-12-04 16:03:59

标签: entity-framework

我有两个数据库恰好具有相同的表名。实体给我一个InvalidOperationException,声明“实体类型'PmsUser'和'AcctUser'不能共享表'NGUSERS'......

我使用代码优先方法创建了这些。

我的模型看起来像

[Table("NGUSERS")]
public partial class AcctUser
{
    ...

[Table("NGUSERS")]
public partial class PmsUser
{
    ...

它们各自拥有各自不同数据库的连接字符串。我需要做些什么才能让它允许相同的表名(修改数据库不是一个选项)?

1 个答案:

答案 0 :(得分:1)

使用两个ModelBuilder而不是属性。然后将创建的DbModel传递给DbConnection。或者在DbContext中设置数据库名称。请参阅Entity Framework Connections and Models

此基类有助于使用DbContext注册模型构建器:

public abstract class ModelBuilderBase {

    protected readonly DbModelBuilder ModelBuilder;

    protected ModelBuilderBase(DbModelBuilder modelBuilder) {
        ModelBuilder = modelBuilder;
    }

    public abstract void BuildModel();
}

模型构建器实现:

public class ModelBuilder1 : ModelBuilderBase {

    public ModelBuilder1 (DbModelBuilder modelBuilder) : base(modelBuilder)
    { }

    public override void BuildModel() {

        ModelBuilder.Entity<AcctUser>().ToTable("NGUSERS");
    }
}

的DbContext:

public class DbContext1 : DbContext { 
    public DbContext1() : base("Database1") /* set DB name */ { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);

        var modelBuilders = new List<ModelBuilderBase> {
            new ModelBuilder1(modelBuilder)
        };

        modelBuilders.ToList().ForEach(x => x.BuildModel());
    }
}

为第二个DB / Table创建ModelBuilder2和DbContext2。