【发布时间】:2011-07-11 15:08:09
【问题描述】:
我的系统中有很多对象都继承自基类Entity。这些对象有很多关系,包括一对一、一对多和多对多。由于我使用的是 WCF,因此我的 DbContext 对象与每个 CRUD 调用都断开连接。这导致我在对具有关系的对象进行基本 CRUD 操作时遇到了一些问题。
例如,我有一个具有基本父子关系的对象。我称之为节点。
[DataContract(IsReference=true)]
public partial class Node : Entity
{
[DataMember]
public long ID { get; private set; }
[DataMember]
public long? ParentID { get; set; }
[DataMember]
public List<Node> Children { get; set; }
}
我希望能够添加一个新节点,该节点的子节点已存在,并且还添加一个节点,该节点的子节点尚不存在。
// Node with a new child node
Node nodeWithNewChild = new Node()
{
Children = new List<Node>()
{
new Node()
}
}
// A pre-existing child node
Node existingChildNode = new Node();
// Node with a pre-existing child node
Node nodeWithExistingChild = new Node()
{
Children = new List<Node>()
{
existingChildNode
}
}
问题是,无论我怎么做,Entity Framework 都会感到困惑。
当我使用基本的 DbContext.Nodes.Add 操作时,它会在我的测试用例与现有孩子的情况下搞混。它在数据库中创建一个现有子项的重复条目,然后为这个新子项提供正确的ParentID。如果我遍历孩子并首先在孩子身上使用DbContext.Nodes.Add,也会发生这种情况。
我尝试循环遍历所有子级并在所有子级上使用DbContext.Nodes.Attach,然后在父级上使用DbContext.Nodes.Add,但这会导致我的新子测试用例出现异常。
System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:存储 更新、插入或删除语句影响了意外数量的 行 (0)。实体可能已被修改或删除,因为实体 被加载。刷新 ObjectStateManager 条目。 ...
更不用说我担心这会如何工作,例如,如果您添加一个带有孩子的节点和一个带有孩子的孩子等等。我希望我的 CRUD 方法对所有可能的有效对象构造做出适当的反应。
根据我能够找到的研究,归结为 EF 不适合或不擅长这种事情,最好自己管理关系。这是真的?如果是这样,有没有我可以效仿的例子?有什么小窍门之类的吗?
我开始使用一种自己处理关系的方法,该方法使用反射,但我觉得这只是解决应该是基本问题的荒谬方法。
【问题讨论】:
标签: c# wcf entity-framework code-first