【问题标题】:How to use one table for two different contexts in two different domains?如何将一张表用于两个不同域中的两个不同上下文?
【发布时间】:2019-04-24 14:53:07
【问题描述】:

我在两个不同的域中有不同的上下文,每个域都包含一个实体“国家”。两个实体都应该使用同一个表“国家”。一个实体包含 xzy 属性,另一个包含 xz 属性。上下文互不认识。问题是我收到错误消息:“数据库中已经有一个名为 'Country' 的对象。”请问在这种情况下最好的方法是什么?提前谢谢你。

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要更改生成表的名称: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);
    

    【讨论】:

    • 感谢您的回复。我想我没有说清楚,但关键是两个实体都使用同一个表。
    • @Lex 您正在尝试做什么(将 2 个不同的模型映射到同一张表是不可能的,也是不好的做法)我已经编辑了我的答案以显示您的问题的可能解决方案
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2021-09-07
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多