一般来说linq在EF中满足了绝大部分的查询需求,而插入、删除则需要根据实体来操作,在一些情况下会造成一些麻烦。
比如现在有这样的关系:
它在数据库中生成的表:
那么在实体对象上下文如果想直接操作某些Product与Category的关联时将麻烦不少,因为不能在EF下直接操作ProductCategory中间表。那么这时直接执行SQL语句来添加、删除两者之间关系会好上不少。我便是这样写的:
1 /// <summary> 2 /// 添加产品到小类 3 /// </summary> 4 /// <param name="proID">产品ID</param> 5 /// <param name="catIDs">小类ID列表</param> 6 public bool AddProductToCategory(int proID, IList<int> catIDs) 7 { 8 bool result = true; 9 foreach (var catID in catIDs) 10 { 11 try 12 { 13 string sql = "Insert Into [ProductCategory] Values (@proID,@catID)"; 14 var args = new DbParameter[] { 15 new SqlParameter { ParameterName = "proID", Value = proID}, 16 new SqlParameter("catID",catID) 17 }; 18 _DataModelEntity.ExecuteStoreCommand(sql, args); 19 } 20 catch (System.Exception ex) 21 { 22 LogHelper.WriteLog(ex); 23 result = false; 24 } 25 } 26 return result; 27 } 28 29 /// <summary> 30 /// 删除小类产品关系 31 /// </summary> 32 /// <param name="proID">产品ID</param> 33 /// <param name="catIDs">小类ID</param> 34 public bool DeleteProductToCategory(int proID,IEnumerable<int> catIDs) 35 { 36 bool result = true; 37 foreach (var catID in catIDs) 38 { 39 try 40 { 41 string sql = "Delete From [ProductCategory] Where [Product_ID] = @proID And [Category_ID] = @catID"; 42 var args = new DbParameter[] { 43 new SqlParameter { ParameterName = "proID", Value = proID}, 44 new SqlParameter("catID",catID) 45 }; 46 _DataModelEntity.ExecuteStoreCommand(sql, args); 47 } 48 catch (System.Exception ex) 49 { 50 LogHelper.WriteLog(ex); 51 result = false; 52 } 53 } 54 return result; 55 }
实际上已经有不少博文中提到了这些使用方法,这里我只是强调它的使用条件,大部分环境下,LINQ和EF的配合已经趋于完美了。
转载请注明原址: http://www.cnblogs.com/lekko/archive/2013/05/28/3103374.html