6

我在尝试更新外键字段时遇到了问题:

record.ForeignId = newId;

由于 SQLMetal 代码抛出System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException().

我不是第一个遇到这个问题的人:

LinqToSQL 错误:由于对象的当前状态,操作无效http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/讨论它, 在其他人中。

他们的解决方案是这样的:

record.Foreign = Database.Foreigns.Single(c => c.Id == newId);

这当然会导致在 Foreign 上进行数据库查找,只是为了取回具有我已经知道的 Id 的对象!那么,如何在没有毫无意义的查询(或者如果我有很多这些 FK 的查询)的情况下完成此更新?

4

3 回答 3

3

您可以新建一个父实例(具有正确的 Id),Attach将其作为现有记录状态添加到数据上下文中,然后分配子对象的 Parent 属性。

这是一些代码:

int theId = 5;
Parent p = new Parent() { Id = theId};
dc.Parents.Attach(p);
child.Parent = p;
于 2010-09-03T15:12:30.783 回答
1

它不能解决问题,但部分绕过额外负载的一种方法是检查现有值是否与新值不同。如果它不同,您将引发查询。就像是 -

if(obj.PropertyID != newValue){
  obj.Property = PropertyClass.Load(newValue)
}
于 2013-03-06T21:56:14.580 回答
0

我遇到过同样的问题。我创建了一个快速的解决方法,可能不是最好的解决方案(因为它可能会影响性能),但它对我有用。

在我的解决方案中,我有一个在类级别声明了我的 DataContext 的类,因此我可以在整个过程中使用它。

在我的解决方案中,我想做的所有事情(与您类似)是将用户的帐户类型 ID 更改为不同的帐户类型 ID(在数据库中这些是 FK)。

由于 DataContext 已经加载,它不允许更改。周围的工作?

我创建了一个函数,在其中创建了一个新的 DataContext 实例,运行我的 LINQ 查询,提交更改,然后处理 DataContext。

于 2014-12-30T06:27:53.447 回答