【发布时间】:2014-05-08 22:41:57
【问题描述】:
我已经编写 C# 代码有一段时间了,我通常使用实体框架并实现存储库模式。存储库模式告诉我们,我们通常应该只维护和访问聚合根的存储库。考虑以下示例,其中 Person 是根:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Pet> Pets { get; set; }
}
public class Pet
{
public int ID { get; set; }
public string Name { get; set; }
}
上述模型意味着我们通常应该通过 PersonRepository 访问宠物。但是,如果我想为一个人修改或添加宠物,我从来没有找到一种优雅的方式来做到这一点。
为了正确识别要更新的内容,我需要调用
DbContext.Entry(myPet).State = EntityState.Modified;
但是,这与我的存储库模式相混淆。据我所知,我有三个选择:
- 创建一个 PersonRepository.AttachPet(Pet pet) 方法。对于复杂且更深的嵌套模型,这很快就会变得很麻烦。
- 直接获取 DbContext 以准备修改或添加宠物。但是,我实现了一个不直接访问 DbContext 的存储库。
- 修改 PersonRepository.Update(Person person) 自动更新底层宠物的状态。也不是很优雅,而且可能是一项艰巨的任务。
我在这里缺少什么?有更好的方法吗?
【问题讨论】:
-
如果你将现有的宠物分配给一个人,我觉得你的宠物可能是它自己的聚合根(这就是我的意思)。有时将聚合视为依赖或独立存在的问题会有所帮助。如果宠物可以在没有 Person 的情况下存在,那么 Pet 应该是它自己的 AggregateRoot。
-
在某些方面存在争议,但您遇到的问题可能是因为您试图在 ORM 之上实现存储库模式...stackoverflow.com/questions/15734485/…
标签: c# entity-framework repository-pattern