Linq插入具有对现有记录的引用的新行的问题
(我相信这和这个问题一样,但那里没有答案,我想我可以在这里更好地表达问题……)
我有两个Linq-to-SQL类, State
和County
,其中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方法。