2011-03-03 20 views
6

我有两个被链接n-n表。我有一个方法需要一个对象并保存。如何附加包含n到n关系的对象?

public int Save(Table1 element) 
{ 
    using (var database = new Entities()) 
    { 
     if (element.ID == 0) 
     { 
      database.Table1.AddObject(element); 
     } 
     else 
     { 
      database.Attach(element); // 
      database.ObjectStateManager.GetObjectStateEntry(element).SetModified(); 
      database.Refresh(RefreshMode.ClientWins, element); 
     } 

     return database.SaveChanges(); 
    } 
} 

当我不尝试修改obj1.Table2它重视并成功扑救。但是,如果我试图修改此EntityCollection

element.Table2.Add(tb2); 

和保存,我得到以下错误:

An object with a temporary EntityKey value cannot be attached to an object context.

在线路:database.Attach(element);

我怎样才能解决这个问题?


数据库:

Table 1    Table 2 
ID | Name   ID | Name 
---------   ------------------- 
1 | One    1 | Related to One 
2 | Two    2 | Related to One 
3 | Three 

      Table 3 
      Tb1 | Tb2 
      --------- 
//   1 | 1 
//   1 | 2 

创建Table1对象:

var element = GetTable1Obj(1); 

element.Table2.Add(GetTable2Obj(1)); // GetTable2Obj uses a separated context 
element.Table2.Add(GetTable2Obj(2)); // like Save method to return the object 

provider.Save(element); // Method above 
+0

你是如何创建TB2?你在哪里打电话给Table2.Add(tb2)? – 2011-03-03 14:25:33

+0

@Ladislav,一种创建上下文并返回对象的方法。 'GetTable2Obj(ID)'='使用(VAR数据库...){返回database.Table2.Where(O => o.ID == ID).FirstOrDefault(); }' – BrunoLM 2011-03-03 14:40:45

+0

但是你添加的代码不应该附加元素。它应该使用AddObject,因为Id被设置为0.无论如何M:N与分离的实体是痛苦的。在这里查看我的回答:http://stackoverflow.com/questions/3635071/update-relationships-when-saving-changes-of-ef4-poco-objects/3635326#3635326 – 2011-03-03 14:46:26

回答

2

enter image description here

如果你的实体框架的工作模式设定为这样的事情你应该能修改t1或t2没有问题。同时仍保持

从表3的外观在您的例子中,你不必为项目的关键。 修改实体对象时会导致问题。你的DB Fk是什么?