Linq插入具有对现有记录的引用的新行的问题

(我相信这和这个问题一样,但那里没有答案,我想我可以在这里更好地表达问题……)

我有两个Linq-to-SQL类, StateCounty ,其中County有一个FK to State 。 这是一些测试代码:

 State s = State.GetState("NY"); // here I do a load of a State class via the Linq DataContext County c = new County(); c.Name = "Rockland"; c.State = s; MyDataContext.GetTable().InsertOnSubmit(c); MyDataContext.SubmitChanges(); // throws an exception 

引发的exception是"Violation of PRIMARY KEY constraint 'PK_State'. Cannot insert duplicate key in object 'dbo.State'"

换句话说,这里似乎发生的事情是,尽管我已经将s作为现有记录加载,但当我尝试插入c ,Linq假设所有相关对象(包括State )也需要插入!

这完全是荒谬的,我无法相信微软会犯这样一个巨大的错误 – 所以它必须是我自己的理解错误的地方。

任何人都可以解释我做错了什么,这里的正确方法是什么?

谢谢!

State.GetState(...)函数是否使用与MyDataContext.GetTable()相同的datacontext?

有点不对劲。 我假设国家 – >伯爵是一对多的关系。 在这种情况下,正确的方法是:

 State s = State.GetState("NY"); // here I do a load of a State class via the Linq DataContext County c = new County(); c.Name = "Rockland"; s.Counties.Add(c); db.SubmitChanges(); 

由于State是父表,因此需要将县添加到州的县集合中。

解决了!

约翰布克问道:

State.GetState(…)函数使用与MyDataContext.GetTable()相同的datacontext?

我的回答是“是” – 他们使用相同的DataContext类……但是他们使用的是不同的实例

获得的经验:对于您计划持久保存到数据库的任何对象,始终使用DataContext类的相同实例

(无论如何,约翰得到了答案的答案……)

如果State没有使用相同的DataContext实例,则可能首先调用Attach方法。