关于 DDD、存储库模式和 ORM,我有一个有点荒谬的问题。在这个例子中,我有 3 个类:Address、Company和Person。一个人是公司的成员并且有一个地址。公司也有地址。
这些类反映了一个数据库模型。我删除了我的模型的所有依赖项,因此它们不会绑定到特定的 ORM 库,例如 NHibernate 或 LinqToSql。这些依赖关系在存储库中处理。
在其中一个存储库中有一个SavePerson(Person person)方法,该方法根据 Person 是否已存在于数据库中来插入/更新它。
由于 Person 对象有一个 Company,因此我目前在进行 SavePerson 调用时也保存/更新了 Company 属性的值。在此过程中,我插入/更新公司的所有数据 - 名称和地址。
但是,我真的很难想到公司的数据在与人打交道时会发生变化的情况——我只想能够将公司分配给一个人,或者将一个人移动到另一个公司。我不认为我想和一个新人一起创建一个新公司。所以 SaveCompany 调用引入了不必要的数据库调用。保存 Person 时,我应该能够更新 CompanyId 列。
但是由于 Person 类有一个 Company 属性,我有点倾向于用它来更新/插入它。从严格/纯粹的角度来看,SavePerson 方法应该保存整个 Person。
首选的方式是什么?只是在保存 Person 或保存其所有数据时插入/更新 Company 属性的 CompanyId?或者你会为这两种场景创建两种不同的方法(你会给它们起什么名字?)
另外,另一个问题,我目前有不同的方法来保存一个人、一个地址和一个公司,所以当我保存一个公司时,我也会调用 SaveAddress。假设我使用 LinqToSql——这意味着我不在同一个 Linq 查询中插入/更新公司和地址。我猜有 2 个 Select Calls(检查公司是否存在,检查地址是否存在)。然后对两者进行两次插入/更新调用。如果引入更多的复合模型类,则更多。LinqToSql 有没有办法优化这些调用?
public class Address
{
public int AddressId { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public Company Company { get; set; }
public Address Address { get; set; }
}
编辑
另请参阅此后续问题。值对象如何存储在数据库中?