【问题标题】:Why is LINQ to SQL entity association creating a new (duplicate) row when inserting a new record?为什么 LINQ to SQL 实体关联在插入新记录时会创建新(重复)行?
【发布时间】:2010-10-21 13:56:32
【问题描述】:

我正在尝试使用 LINQ-to-SQL 插入新实体,并且实体与用户实体相关联。新实体的插入成功,但我现有的用户实体被插入,就好像它是一个新用户一样。代码如下所示:

var someEntity = new Entity();
someEntity.User = this.User;
dataContextInstance.SomeEntities.InsertOnSubmit(someEntity);
dataContextInstance.SubmitChanges();

有谁知道为什么将用户作为一个全新的实体插入到用户表中?看起来 User.UserId 将成为映射到正在插入的 someEntity 的行的 UserId 列中的外键值。

感谢任何帮助/建议/cmets

【问题讨论】:

  • 在你的代码中,你有“entity”和“someEntity”

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


【解决方案1】:

由于 User 实体先前已被另一个 DataContext 加载(希望现在应该被释放!),您必须将其附加到新的(当前)DataContext 否则 DataContext 会将其视为新实体而不是现有的(已存在于数据库中)。

【讨论】:

  • 感谢您的回答。我期待 LINQ-to-SQL 的下一个版本,希望成为一个完整的 ORM,支持分离和重新附加,并且比我发现的许多帖子搜索更直观的方式回答一些根本不是真正的困境,而是我对技术的误解。
  • 当您必须附加的东西是从更高级别的缓存传入时,这是一个不太可接受的解决方案。它可能工作一次,但是当更高级别的缓存试图插入另一个对象时,世界就会爆炸,因为缓存的实体只能附加一次,并且因为它是在较低的抽象级别附加的,所以它无法知道它需要在缓存中重新分离。 Linq to sql 太痛苦了。
【解决方案2】:

确保您对两个表使用相同的实例 DataContext。请参阅我的问题here 以获得(我认为)对问题的更清晰的解释。

【讨论】:

  • 我很想使用相同的 DataContext 实例,但我不能,因为它是通过 WCF 序列化的。
【解决方案3】:

对不起,我不明白?您想更新现有用户吗? someEntity 有什么用?

LINQ 尝试插入新用户是有道理的,因为您告诉它这样做。如果您只想更改您的用户之一,您需要从 SomeEntities 中选择他,进行更新,然后调用 SubmitChanges(LINQ 会识别,原始实体已被修改) - 没有 .InsertOnSubmit。

【讨论】:

  • 好吧,我可以写:someEntity.UserId = this.User.UserId,但这感觉很奇怪,因为我试图将(现有用户)this.User 与我的 someEntity 实例相关联。 “someEntity”可以是我想与现有用户关联的任何实体。我只是认为我与 LINQ-to-SQL 的实现不一致。如果行为是插入所有孩子而不考虑隐含的关系,那感觉不是很ORM。不要误会,我喜欢 LINQ,但这种行为看起来很奇怪。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
相关资源
最近更新 更多