【发布时间】:2014-07-07 00:39:43
【问题描述】:
这可能以前被问过,但我似乎无法在网站上找到解决方案,所以我们开始吧:
这是我的域模型的过度简化版本。我有 2 个类代表数据库中的 2 个表:
public Class Person
{
public int Id { get; set;}
public string Name { get; set;}
public virtual List<Contact> Contacts { get; set;}
public void AddContact(string value)
{
//some validation code
Contacts.Add(new Contact(value));
}
public void DeleteContact(Contact contact)
{
//some validation code
Contacts.Remove(contact);
}
}
public Class Contact
{
public int Id { get; set;}
public string Value { get; set;}
public virtual Person Person { get; set;}
public int PersonId { get; set;}
}
现在 Person 是我的总根。我试图通过只为聚合根创建存储库来遵循 DDD 主体。添加联系人工作正常。
我遇到的问题是删除联系人时。它给出了错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
反正过去了。如果关系属性不可为空,实体框架不应自动删除联系人。
现在我知道从集合中删除与从上下文中删除它不同,但我不想从我的域模型中引用 DbContext。
我只有 PersonRepository。
如果我有任何概念错误,请提供解决方案或帮助我理解。
【问题讨论】:
-
对于域模型和 EF 模型使用同一个类并不是一个好主意。 EF 模型应该只提供一种服务领域模型的方法。
-
@JotaBe 我们如何才能做到这一点?
标签: c# entity-framework repository domain-driven-design aggregateroot