2011-05-17 20 views
1

我正在使用Visual Studio 2008和.NET Framework 3.5。Visual Studio 2008 LINQ刪除行不起作用

我想要做我以爲會使用LINQ到實體的一些行的簡單刪除。

我有一個簡單的SQL Server數據庫後端,我使用數據實體框架來訪問它。我對EDMX中創建的默認行爲沒有做任何事情。

我試圖下面的代碼:

  myDB.Dispose(); 
      myDB = new EChODatabaseConnection(); 


      //get our equipment list of requested equipment 
      var OldEquip = from u in myDB.dbEquipmentRequestedSet 
              where u.iRequestID == requestID 
              select u; 
      myDB.DeleteObject(OldEquip); 

      myDB.SaveChanges(); 

它到達db.DeleteObject(OldEquip),並生成以下錯誤:

「的對象不能被刪除,因爲它沒有被發現在ObjectStateManager中「。

我已驗證在執行代碼行之前OldEquip中有某些內容。

我添加了前兩行代碼(Dispose和new),以避免以前的代碼出現問題。

編輯 的dbEquipmentRequestedSet看起來是這樣的:

iRequestID (in db an int) 
sCode  (in db a varchar(50)) 
SCodePrefix (in db a varchar(10)) 

我使用基於iRequestID和SCODE複合主鍵。

EDIT2 要澄清,在幾乎所有情況下,OldEquip查詢將導致多個結果。

從迄今爲止的答案看來,我將不得不手動檢查每個條目才能刪除。

有沒有更優雅的解決方案?也許通過使用存儲過程?

回答

1

聽起來像要刪除倍數。試試這個:

var OldEquip = (from u in myDB.dbEquipmentRequestedSet 
          where u.iRequestID == requestID 
          select u) 
        .ToList(); 

foreach(var item in OldEquip) 
{ 
    myDB.DeleteObject(item); 
} 

如果DeleteObject接受一個對象,這應該是包含在ObjectStateManager.Your代碼公司目前通過它沒有包含在ObjectStateManager的ObjectQuery<T>實體可能的原因。

更多在此MSDN forum post

+0

查詢將產生一個以上的價值。 *添加*編輯顯示dbEquipmentRequestSet。 – 2011-05-17 20:33:55

+0

是的,查詢有99%可能會導致多重。 – 2011-05-17 20:42:45

+0

@John:查看更新後的答案。 – 2011-05-17 20:42:59

0

OldEquip在這種情況下是IQueryable類型。您只能刪除實際的實體,所以你將不得不修改LINQ語句是這樣的:

var OldEquip = (from u in myDB.dbEquipmentRequestedSet 
       where u.iRequestID == requestID 
       select u).First(); 

,或如果查詢單獨使用foreach和刪除所有項目返回多個值,遍歷的IQueryable的所有結果。

+0

我剛剛試過這與ToList,它給了我同樣的錯誤消息:( – 2011-05-17 20:39:57

+0

@約翰石頭,'ToList!=第一'。如果你想刪除多個你將不得不枚舉它們並多次調用DeleteObject – tster 2011-05-17 20:42:06

+1

你必須做一個'foreach'並分別刪除列表中的每個項目,我原來的措辭有些不清楚,對此很抱歉。 – Thorarin 2011-05-17 20:43:02

0

我,如果你想使用他們,我用它來刪除一次對多個對象的一些擴展方法:

public static void DeleteAll(this ObjectContext context, IEnumerable<object> collection) 
    { 
     foreach (var item in collection.ToList()) 
     { 
      context.DeleteObject(item); 
     } 
    } 

    public static void DeleteAll<TEntity>(this ObjectSet<TEntity> context, IEnumerable<TEntity> collection) where TEntity : class 
    { 
     foreach (var item in collection.ToList()) 
     { 
      context.DeleteObject(item); 
     } 
    }