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

时间:2009-04-27 20:40:07

标签: c# .net linq linq-to-sql

(我认为这与this one的问题相同,但那里没有答案,我想我可以在这里更好地表达问题......)

我有两个Linq-to-SQL类StateCounty,其中County的FK为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<County>().InsertOnSubmit(c);
MyDataContext.SubmitChanges(); // throws an exception

抛出的异常是"Violation of PRIMARY KEY constraint 'PK_State'. Cannot insert duplicate key in object 'dbo.State'"

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

这是完全荒谬的,我无法相信微软会犯这么大的错误 - 所以必须在我自己的理解错误的地方。

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

谢谢!

4 个答案:

答案 0 :(得分:0)

有些东西不对。我假设国家 - &gt;伯爵是一对多的关系。在这种情况下,正确的方法是:

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是父表,因此您需要将县添加到州的县集合中。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

解决!

John Boker问道:

  

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

我的回答是“是” - 他们使用相同的DataContext类......但是他们使用了不同的实例

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

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

答案 3 :(得分:0)

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