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