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

 

posted @ 2013-12-30 16:25  小飞的DD  阅读(243)  评论(0编辑  收藏  举报