一般来说linq在EF中满足了绝大部分的查询需求,而插入、删除则需要根据实体来操作,在一些情况下会造成一些麻烦。
比如现在有这样的关系:
它在数据库中生成的表:
那么在实体对象上下文如果想直接操作某些Product与Category的关联时将麻烦不少,因为不能在EF下直接操作ProductCategory中间表。那么这时直接执行SQL语句来添加、删除两者之间关系会好上不少。我便是这样写的:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 ///2 /// 添加产品到小类 3 /// 4 /// 产品ID 5 /// 小类ID列表 6 public bool AddProductToCategory(int proID, IList catIDs) 7 { 8 bool result = true; 9 foreach (var catID in catIDs)10 {11 try12 {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 ///30 /// 删除小类产品关系31 /// 32 /// 产品ID33 /// 小类ID34 public bool DeleteProductToCategory(int proID,IEnumerable catIDs)35 {36 bool result = true;37 foreach (var catID in catIDs)38 {39 try40 {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的配合已经趋于完美了。
转载请注明原址: