值对象没有身份。 ORM需要身份来更新数据库。DDD,值对象和ORM
如何欺骗ORM?
(标记为值为内部的对象不起作用,导致ORM存在于不同的程序集中并将它移动到同一个程序集中是不可接受的)。
在此先感谢。
值对象没有身份。 ORM需要身份来更新数据库。DDD,值对象和ORM
如何欺骗ORM?
(标记为值为内部的对象不起作用,导致ORM存在于不同的程序集中并将它移动到同一个程序集中是不可接受的)。
在此先感谢。
就我对DDD的理解而言,值对象只是一种划分实体的方法。如果一个值对象应该在数据库中存储一个ID,它不是一个值对象。
例子:
域模型看起来像这样(C#):
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; }
}
对应的数据库表看起来是这样的(伪SQL):
CREATE TABLE Customers
(
CustomerID,
LastName,
HomeAddress_Street,
HomeAddress_City,
HomeAddress_ZipCode,
)
要将地址存储在单独的表中,您需要使其成为具有ID的实体。
就我个人而言,我在值对象中有Id字段 - 我将它作为值对象的另一个属性(例如名称,位置等)。
这可能不是真正的DDD,但它适用于我。
我不认为这是有问题的。埃里克埃文让每个人的头脑都在旋转,因为在没有举例的情况下谈论概念很容易。 – 2012-11-16 22:11:23
当埃里克埃文斯谈到“实体具有身份,价值对象不”时,他不是在谈论数据库中的ID列 - 他谈论的身份是概念。
VOs没有概念的身份。这并不意味着他们不应该有持久性的身份。不要让持久性实现影响您对实体vs VOs的理解。
看到我的帖子here。
但是那么域模型只是数据库的1:1,地址仍然可以是一个值对象,并且仍然有一个单独的表。 – TWith2Sugars 2009-06-05 08:30:56
不,它不是数据库的1:1。 您有一个Customer类和一个Adress类(它是值对象)。在NHibernate中,一个值对象被映射为一个组件。 只要你有一个实体需要一个Id,它不再是一个值对象。 – 2009-06-05 08:39:47