使用Entity Framework创建实体的实体。

3
当实体需要在其方法中创建其他实体时,您该如何处理?我的问题是,由于每个单独的实体都没有访问ObjectContext对象的权限,即具有AddToBlahs()方法的对象,因此它无法执行此操作。
例如,有一个站点模型,其中有一个UpdateLinks()方法,应该创建属于该站点的Link对象。 UpdateLinks()方法没有ObjectContext。你怎么办?像这样传递一个吗:
```csharp public void UpdateLinks(ObjectContext context) { // ... context.AddToLinks(link); // ... } ```
public void UpdateLinks(ProjectEntities db) {
    foreach (var link in FetchLinks()) {
        db.AddToLinks(link);
    }
}

或者你使用其他的模式吗?

现在我也有相反的问题 :( http://stackoverflow.com/questions/2097883/how-to-delete-an-asociated-object-in-entity-framework-without-having-access-to-th - pupeno
2个回答

2
您不需要上下文。由于Site.UpdateLinks正在创建属于该实例的Link对象,因此该实例将与新的Site关联。将Link添加到Site.Links会自动使新的Link成为与Site(如果有)相同上下文的一部分。同样,当您保存Site时,Link将与之一起保存。

我尝试过使用Links.Add(link)来添加链接,其中Links是LinkSet,但是我得到了以下错误信息:“'ProjectEntities.Links'中的实体参与'Sites_have_Links'关系。找到0个相关的'Sites'。期望1个'Sites'。” 我已经在新链接中设置了Site关系为“this”。 - pupeno
这并不是我建议做的事情。话虽如此,如果您已经正确定义了关系属性,将Link.Site设置为某个站点应该可以使其正常工作。 - Craig Stuntz
我正在做的是:var link = new Link(); link.Site = this; this.Links.Add(link); 它可以工作。那么你所建议的是什么(除了link.Site = this可能是多余的)? - pupeno
我没有理解到你在评论中有一个隐式的this - Craig Stuntz

1

对于Craig Stuntz的答案我不太确定...链接应该附加到上下文中,但是将链接添加到Site.Links中并不会自动附加。无论如何,您仍需要执行db.AddToLinks(link)。

但是回答您的问题,ObjectContext管理的最佳模式之一可能是UnitOfWork模式。通过使用它,您可以使实体“自我感知它们当前所属的范围”。 请查看此article以获取详细说明和实现示例。 尽管如此,您仍然可以像在示例中那样将ObjectContext作为参数传递给方法(作为更简单的实现)。


1
你错了。如果一个对象已经附加到上下文中,而第二个对象没有,将这两个对象关联起来会将第二个对象附加上去。试一下!在进行关联之前和之后查看 second.EntityState。你还错误地认为需要调用 AddToLinks - Craig Stuntz
是的,那我就改正了,谢谢。这也让我少写了几行代码 ;) - Yakimych

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接