我正在尝试遵循聚合设计原则,并提出了需要帮助的情况。我的聚合根是一个Customer
对象。该Customer
对象具有对象的Address
子集合和Contact
对象的子集合。
AContact
可以引用聚合Address
下的a。Customer
该Customer
对象具有唯一性ID
,而Address
andContact
对象具有本地 id,因此数据库中的主键是CustomerId
and AddressId
。
以下是简化的类:
public class Customer : AggregateRoot {
public virtual int CustomerId { get; protected set; }
public virtual IList<Address> Addresses { get; protected set; }
public virtual IList<Contact> Contacts { get; protected set; }
}
public class Address : Entity {
public Address(Customer customer, int addressId) {
this.Customer = customer;
this.AddressId = addressId;
}
public virtual Customer Customer { get; protected set; }
public virtual int AddressId { get; protected set; }
}
public class Contact : Entity {
public Contact(Customer customer, int contactId) {
this.Customer = customer;
this.ContactId = contactId;
}
public virtual Customer Customer { get; protected set; }
public virtual int ContactId { get; protected set; }
public virtual Address Address { get; set; }
}
该数据库具有如下表:
顾客
CustomerId int identity PK
地址
CustomerId int not null PK,FK
AddressId int not null PK
接触
CustomerId int not null PK,FK
ContactId int not null PK
AddressId int null FK
当我尝试使用 Fluent NHibernate 映射我的实体时,我的问题就出现了。因为Address
对象有一个复合键CustomerId
and AddressId
,NHibernate 不会重用CustomerId
联系人表中的列。当我尝试保存聚合时,我得到一个异常,说值多于参数。发生这种情况是因为 Address 对象具有复合 ID,并且不CustomerId
与对象共享列Contact
。
我能看到解决这个问题的唯一方法是AddressCustomerId
在表中添加一列Contact
,但现在我有一个重复的列,CustomerId
并且AddressCustomerId
是相同的值。反正有这种行为吗?