我想使用@Thanh Nguyen的解决方案来自这个问题:How do I delete multiple rows in Entity Framework (without foreach)
他的解决方案是这种方法:
public static void DeleteWhere<T>(this DbContext db, Expression<Func<T, bool>> filter) where T : class
{
var query = db.Set<T>().Where(filter);
string selectSql = query.ToString();
string deleteSql = "DELETE [Extent1] " + selectSql.Substring(selectSql.IndexOf("FROM"));
var internalQuery = query.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Where(field => field.Name == "_internalQuery").Select(field => field.GetValue(query)).First();
var objectQuery = internalQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Where(field => field.Name == "_objectQuery").Select(field => field.GetValue(internalQuery)).First() as ObjectQuery;
var parameters = objectQuery.Parameters.Select(p => new SqlParameter(p.Name, p.Value)).ToArray();
db.Database.ExecuteSqlCommand(deleteSql, parameters);
}
您可以看到第一个参数是DbContext类型。在我的项目中,我首先使用EF 6,数据库,但我的上下文类扩展自ObjectContext,而不是DbContext。因此,作为使用DeleteWhere扩展方法的解决方法,我想从我的对象上下文中获取db上下文,所以我尝试了这个:
using (var db = new MyEntities(connectionString))
{
db.TransactionHandler.DbContext.DeleteWhere(myClause);
}
这有效:
using (var db = new MyEntities(connectionString))
{
db.MyTable.DeleteObject(myObject);
}
但DbContext为null。
我做错了什么?