【问题标题】:How to implement column or table attributes in Entity of a Domain Driven approach?如何在域驱动方法的实体中实现列或表属性?
【发布时间】:2021-05-30 07:14:26
【问题描述】:

实体不是由其属性定义的对象,而是由连续性及其标识定义的对象。

我设计了一个 sipmle 实体如下。

public class Employee: Entity<Guid>
{
    private string name;

    public string Name { 
       get { return name; } 
       set {
           if(string.IsNollOrEmpty(value))
              throw new Exception("name is required.");
           name = value;
       }
    }
    
    public Employee(string name)
    {           
        Name = name;
    }
}

但是当我使用实体框架 ORM 工具时,某些情况需要 Column 或 Table 属性。

例如 Postgresql 数据库小写列名。

[Table("employees")]
public class Employee: Entity<Guid>
{
   ....
   [Column("name")]
   public string Name {...}
}

Oracle 需要大写名称。

[Table("EMPLOYEES")]
public class Employee: Entity<Guid>
{
   ....
   [Column("NAME")]
   public string Name {...}
}

Mssql 接受这两种名称样式。

[Table("Employees")]
public class Employee: Entity<Guid>
{
   ....
   [Column("Name")]
   public string Name {...}
}

所以我无法创建 3 个不同的实体。但我需要一个切实可行的解决方案。我只需要一个实体,但如果数据库更改,我的代码不应该更改。

【问题讨论】:

  • 这与DDD无关。通过 fluent API 而不是数据注释(属性)配置数据库映射。 Fluent 配置 (OnModelCreating) 对于每种数据库类型都是独立的,因此您可以应用不同的命名规则等。

标签: c# entity-framework entity-framework-core domain-driven-design


【解决方案1】:

你自己已经给出了答案:“我只需要一个实体,但如果数据库发生变化,我的代码不应该改变。”

根据该指南选择您的方法和框架。基础设施关注点应该与领域关注点分开。使用持久性元数据注释域对象并完成它是很诱人的。它会在某些时候困扰您,因为由于与底层数据库的紧密耦合,您无法轻松地重构或发展您的域对象以“获得更大的洞察力”。

就像所有事情一样,这是一个权衡。如果您使用的是 DDD,则应考虑使用未篡改/纯域对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多