如何在两个不同域中的两个不同上下文中使用一个表?

时间:2019-04-24 14:53:08

标签: c# .net-core entity-framework-core ef-migrations

我在两个不同的域中有不同的上下文,并且每个域都包含一个实体“国家”。两个实体应使用相同的表“国家/地区”。一个实体包含xzy属性,另一个包含xz属性。上下文彼此不认识。问题是我遇到了错误:“数据库中已经有一个名为'Country'的对象。”在这种情况下,最好的方法是什么?预先谢谢你。

3 个答案:

答案 0 :(得分:1)

通常,一个实体仅属于一个上下文/域。如果您需要在另一个域中使用此实体,则只需使用其定义的上下文。在事务中使用多个上下文没有任何问题。即使可能,从概念上和技术上,我们也不建议您尝试做的事情。

答案 1 :(得分:0)

您需要更改生成的表的名称:How to Specify Entity Framework Core Table Mapping?

可以使用:

[Table("CountriesCustomTableName")]
public class Country{ x, y, z }

或像这样覆盖OnModelCreating:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Country>(entity => {
        entity.ToTable("CountriesCustomTableName");
    });
}

请记住要完全限定您的班级名称,否则您会感到困惑或出现模棱两可的编译错误

修改

如果您尝试将2个不同的实体模型映射到同一张表,听起来您的样式或设计可能会有所改善。

我建议您要么使用完整的域模型,要么在输入“半域模型”时填充一半的模型。

public class Country {
    public string X { get; set; }
    public string Y { get; set; }
    public string Z { get; set; }

}


var country1 = new Country() { X = "A", Y = "B", Z = "C" };
var country2 = new Country() { X = "A", Z = "C" };

context.Countries.Add(country1);
context.Countries.Add(country2);

或者(更有可能)这是某种形式的代码气味,您需要将可选值抽象到另一个表中,例如:

public class Country {
    public string X { get; set; }
    public string Z { get; set; }

}
public class CountryYInfo {
    public string Y { get; set; }

    public Country Country { get; set; }
    public int CountryId { get; set; }
}


var country1 = new Country() { X = "A", Z = "C" };
var countryInfo = new CountryYInfo { Y = "B", Country = country1 };

var country2 = new Country() { X = "A", Z = "C" };

context.Countries.Add(country1);
context.Countries.Add(country2);

答案 2 :(得分:0)

如果要在两个域之间共享国家/地区数据,则从逻辑上将“国家/地区”视为另一个域。通过ID而不是域间引用来引用国家/地区记录,这在DDD中是很糟糕的做法。