【问题标题】:linq-to-sql "Cannot remove an entity that has not been attached"linq-to-sql“无法删除尚未附加的实体”
【发布时间】:2014-09-03 00:09:19
【问题描述】:

我在尝试删除记录时收到错误 Cannot remove an entity that has not been attached.。我搜索了一下,虽然有很多地方可以找到解决此问题的解决方案,但建议的解决方案并没有让我更进一步:

using (MyDataContext TheDC = new MyDataContext())
{
  TheDC.MyTable.Attach(ARecord); //added this line but doesn't fix it.
  TheDC.MyTable.DeleteOnSubmit(ARecord);
  TheDC.SubmitChanges();

我更大的问题是:这个问题只影响删除查询还是也影响其他类型的查询,我还没有遇到这个问题。我编写了一个更新查询,它似乎可以正常工作而不会遇到此错误。

谢谢。

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    请参考这篇 SO 帖子:How to delete in linq to sql?

    ...关于附加,如果您已经拥有主键。如果您没有主键,那么我总是先获取然后删除,但是,每当我进行获取时,我倾向于存储主键以进行更新和删除。

    它会从主键中删除,但如果你有它,那么就像我在下面做的那样附加并调用删除。我不传递 LINQ 所需的对象,因为我希望能够根据需要更改它,所以我传入了一个不同的 User 对象,然后从业务类中提取 PK 并将其放入 DAO 类中。

    var db = new MeatRequestDataContext();            
    if (input.UserID > 0)
    {
         entity = new User()
         {
             UserID = input.UserID
         };
         db.Users.Attach(entity);
         db.Users.DeleteOnSubmit(entity);
     }
    

    【讨论】:

      【解决方案2】:

      对我来说,修复只是首先搜索数据库对象。

      var db = new MeatRequestDataContext();
      if (input.UserID > 0)
      {
          var existing = db.Users
              .Single(user => user.UserID == input.UserID);
      
          db.Users.DeleteOnSubmit(existing);
      }
      

      在我看来,我只能删除已经存在的内容,所以我需要先去获取数据库中我想删除的项目。这也适用于集合和 DeleteAllOnSubmit()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多