我有一个关于 DDD、存储库模式和 ORM 的有点荒谬的问题。在这个例子中,我有 3 个类:Address, Company and Person。个人是公司的成员并拥有地址。公司也有地址。
这些类反映了数据库模型。我删除了模型的所有依赖项,因此它们不依赖于特定的 ORM 库,例如 NHibernate 或 LinqToSql。这些依赖关系在存储库内处理。
里面的一个存储库有一个保存人(人)方法其中插入/更新一个 Person 取决于它是否已经存在于数据库中。
由于 Person 对象有一个 Company,因此我当前在进行 SavePerson 调用时也会保存/更新 Company 属性的值。在此过程中,我插入/更新了公司的所有数据 - 名称和地址。
然而,我真的很难想象在处理个人时公司的数据可能会发生变化的情况 - 我只想能够将公司分配给个人,或者将个人移动到另一个公司。我认为我不想与新人一起创建一家新公司。因此 SaveCompany 调用会引入不必要的数据库调用。保存人员时,我应该能够更新 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; }
}
Edit
另请参阅这个后续问题 https://stackoverflow.com/questions/679005/how-are-value-objects-stored-in-the-database。值对象如何存储在数据库中?