价值对象没有身份。ORM 需要身份来更新数据库。
如何欺骗 ORM?
(将值对象的 ID 标记为“internal”不起作用,因为 ORM 存在于不同的程序集中,将其移动到相同的程序集中是不可接受的。)
提前感谢。
价值对象没有身份。ORM 需要身份来更新数据库。
如何欺骗 ORM?
(将值对象的 ID 标记为“internal”不起作用,因为 ORM 存在于不同的程序集中,将其移动到相同的程序集中是不可接受的。)
提前感谢。
当Eric Evans谈到“实体具有身份,值对象没有”,他所说的并不是数据库中的ID列 - 他所说的是身份作为一个概念。
值对象没有概念上的身份。这并不意味着它们不应该有持久化身份。不要让持久化实现影响你对实体和值对象的理解。
请参见我在这里的帖子。
public class Customer : Entity
{
public Guid CustomerID { get; }
public string LastName { get; set; }
public Address HomeAddress { get; set; }
}
public class Address : ValueObject
{
public string Street { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}
CREATE TABLE Customers
(
CustomerID,
LastName,
HomeAddress_Street,
HomeAddress_City,
HomeAddress_ZipCode,
)
个人而言,我将Id字段放在值对象中 - 我将其视为值对象的另一个属性(例如名称,位置等)。
这可能不是真正的DDD,但对我来说有效。
VO属于实体(Entity)。 我们将使用实体的ID(业务 ID)来跟踪VO。
VO还可以包含其他实体/VO,它代表OO(面向对象编程)的封装。 以E-R,1:N为例,我们可以使用联合表来持久化它。
专注于业务,而不是那些概念。
你有两个选项:
例如,对于你的示例:
public class Customer : Entity
{
public Guid CustomerID { get; }
public string LastName { get; set; }
public Address HomeAddress { get; set; }
}
public class Address : ValueObject
{
public string Street { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
}
选项1(伪SQL):
CREATE TABLE Customer (
// aggregate root
customerId int NOT NULL,
lastName VARCHAR(30),
// value object
street VARCHAR(100),
city VARCHAR(50),
zip VARCHAR(10)
CONSTRAINT PK_Customer PRIMARY KEY (customerId)
)
选项2(伪SQL):
// aggregate root
CREATE TABLE Customer (
customerId int NOT NULL,
lastName VARCHAR(30)
CONSTRAINT PK_Customer PRIMARY KEY (customerId)
)
// value object
CREATE TABLE Address (
customerId int NOT NULL, // same ID from Customer
street VARCHAR(100),
city VARCHAR(50),
zip VARCHAR(10)
CONSTRAINT PK_Address PRIMARY KEY (customerId)
)
toDomain(sqlResult)
函数,将查询结果转换为您的域对象单表
方法