【发布时间】: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