Entity FrameWork 积累
1、添加事务
添加引用System.Trasactions
代码:
using (TransactionScope tran = new TransactionScope()) { .................... tran.Complete(); }
2、错误的关联数据创建
在项目中有Product和ProductAttribue两个表,Product和ProductAttribue是一对多的关系,目的是在修改Product的同时添加新的ProductAttribue
首先看错误版本:
这里传进来了一个Product对象,首先修改了Product的Name,然后是添加新的ProductAttribue。
可以看到,我给ProductID和Display赋了值,然后就将被循环的p添加到_context里了,这样是不对的,这样导致的结果是在数据库里又创建了一个新的Product。
public void UpdateProductDetails(Product product) { try { using (TransactionScope tran = new TransactionScope()) { #region 修改product Product ToBeSaved = new Product { ProductID = product.ProductID }; ToBeSaved.Name = "?"; _context.Products.Attach(ToBeSaved); ToBeSaved.Name = product.Name; #endregion #region 修改attributes //添加新的ProductAttributes short i = 1; foreach (var p in product.ProductAttributes.Where(x=>x.Value!=null)) { p.ProductID = product.ProductID; p.DisplayOrder = i; _context.ProductAttributes.AddObject(p); i++; } #endregion _context.SaveChanges(); tran.Complete(); } } catch (Exception E) { throw E; } }
正确的版本,创建一个新的ProductAttribute
short i = 1; foreach (var p in product.ProductAttributes.Where(x=>x.Value!=null)) { ProductAttribute productAttribute = new ProductAttribute { ProductID = product.ProductID, Name = p.Name, Value = p.Value, DisplayOrder = i }; _context.ProductAttributes.AddObject(productAttribute); i++; }
3、选择性获取关联数据
在项目中有Product和eBayListingSetting两个表,Product和eBayListingSetting是一对多的关系。现在要获取Product和某一条eBayListingSetting数据
Product product = (from p in _context.Products.Include("ProductAttributes") where p.ProductID == ProductID select p ).FirstOrDefault(); eBayListingSetting ebayListingSettings = (from e in _context.eBayListingSettings where e.eBayListingSettingID == eBayListingSettingID select e ).FirstOrDefault(); product.eBayListingSettings.Add(ebayListingSettings);
这里首先要说到一个关于延迟加载的问题
数据对象是ObjectContext,他会有一个值叫LazyLoadingEnabled,这个值为true的时候,即使上述代码的Products没有Include("ProductAttributes"),"ProductAttributes"也会被加载进来,ebayListingSettings也会被加载进来。所以现将LazyLoadingEnabled=false,这样就可以不加载ebayListingSettings,然后有选择的添加想要的ebayListingSetting到Product