2014-03-27 76 views
0

我有這樣的代碼,但它不工作:如何使用實體框架刪除多行?

public bool DeleteAccess(int _UserID, IEnumerable<int> _ModulID) 
{ 
    MPortalContext db=new MPortalContext(); 
    foreach (var item in _ModulID) 
    { 
     var validation = db.WebSite_PermissionDB.Where(x => x.UserID == _UserID && x.ModuleID == item); 
     db.WebSite_PermissionDB.Remove(validation); 
    } 
    db.SaveChanges(); 
    return true; 
} 

我(_ModulID)是我過濾它們ID的集合,然後用foreach刪除它們,但它不工作?

回答

0
MPortalContext db=new MPortalContext(); 
    foreach (var item in _ModulID) 
    { 
     var validation = db.WebSite_PermissionDB.Where(x => x.UserID == _UserID && x.ModuleID == item).FirstOrDefault(); 
     db.WebSite_PermissionDB.Remove(validation); 
     db.SaveChanges(); 
    } 
    return true; 

我忘了使用.FirstOrDefault();現在是正確的。感謝朋友。

1

首先要獲取與您的條件符合項目的所有實體,然後利用RemoveRange方法:

var entities = db.WebSite_PermissionDB 
      .Where(x => x.UserID == _UserID && _ModulID.Contains(x.ModuleID)); 

db.WebSite_PermissionDB.RemoveRange(entities); 

db.SaveChanges(); 

你也可能要使用using聲明,以確保您的DbContextDisposed正常。刪除

using(MPortalContext db = new MPortalContext()) 
{ 
    ... 
} 
+0

在我的代碼中:不知道RemoveRange&Contains。但是我使用nameSpaces:using System.Data.Entity; &using System.Data.Objects.DataClasses;但不知道。 –

0
var distinctResult = db.WebSite_PermissionDB.Distinct(); 
db.WebSite_PermissionDB.RemoveRange(db.WebSite_PermissionDB.Except(distinctResult)); 
db.SaveChanges(); 
+0

您可以爲此代碼示例對您的答案做些什麼嗎? – Dutts

+0

首先通過刪除重複行(Distinct method)來選擇數據,然後刪除所有行,除非在之前的代碼中選擇了數據(除了方法)。 –

2

一種方法是

context.Database.SqlQuery<WebSite_PermissionDB>(
    "DELETE FROM Users WHERE UserID = @userId ", 
    new [] { new SqlParameter("@userId ", 1) } 
);