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

问题描述 投票:-1回答:3

我在两个不同的域中有不同的上下文,每个域包含一个实体“country”。两个实体都应使用相同的表“country”。一个实体包含xzy属性,另一个实体包含xz属性。情境彼此不了解。问题是我收到错误:“数据库中已经有一个名为'Country'的对象。”在这种情况下,最好的方法是什么?先感谢您。

c# .net-core entity-framework-core ef-migrations
3个回答
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);

0
投票

如果要在两个域之间共享国家/地区数据,则“国家/地区”在逻辑上被视为另一个域。引用国家记录的ID而不是域间重新注册,这在DDD中是一种可怕的做法。

© www.soinside.com 2019 - 2024. All rights reserved.