中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

EF架構(gou)~簡(jian)潔關聯表(biao)插入,優(you)越的代碼性(xing)能(neng)!

回到目錄

entity frameworks給我們代(dai)來(lai)的(de)不只是操作方(fang)便(bian),代(dai)碼(ma)簡潔,代(dai)碼(ma)人(ren)性化(hua)強,而且更重要(yao)(yao)的(de)是它的(de)代(dai)碼(ma)執行(xing)效(xiao)率也是可以信任的(de),這一(yi)點對(dui)于我們來(lai)說十分重要(yao)(yao),因為對(dui)于ORM來(lai)說,你再使用(yong)方(fang)便(bian),再容易上(shang)手,如(ru)果(guo)你的(de)性能低(di)下,我估計也沒人(ren)愛用(yong),呵呵。

今天主要(yao)說(shuo)一下entity frameworks中的關(guan)聯表插入問題,我(wo)們以(yi)訂單業務為例來(lai)說(shuo)一下:

一 數據結果圖(tu)如下:

二 在(zai)EF中(zhong),數(shu)據結構(gou)關聯圖會(hui)體(ti)現在(zai)模型里,并且同時會(hui)生成在(zai)實體(ti)中(zhong),它(ta)以導航(hang)屬性的(de)形式出現,如圖:

   public partial class Order_Info
    {
        public Order_Info()
        {
            this.Order_Detail = new HashSet<Order_Detail>();
        }
    
        public int OrderID { get; set; }
        public int UserID { get; set; }
        public System.DateTime CreateDate { get; set; }
    
        public virtual ICollection<Order_Detail> Order_Detail { get; set; }
    }

三 使用我們封裝(zhuang)好的(de)Add方法,將order_info實(shi)體插(cha)入,如果(guo)order_info里的(de)Order_Detail屬(shu)性的(de)Count大于0,將會建立(li)Order_info對(dui)象的(de)add方法,這一(yi)切(qie)

由EF內部自動實現,看代碼:

       public void Add(T item)
        {
            this.Add(item, true);
        }

        public void Add(T item, bool isSubmit)
        {
            _db.Entry<T>(item);
            _db.Set<T>().Add(item);
            if (isSubmit)
                this.SaveChanges();
        }

四 為order_info 和order_detail賦(fu)值(zhi)(zhi),如(ru)果它們已經存(cun)在(zai)了表(biao)關聯,那么在(zai)order_detail里(li),你不需要為orderid賦(fu)值(zhi)(zhi),因為它在(zai).net環境中,還沒(mei)有確(que)定值(zhi)(zhi)

(order_info與order_detail主鍵都是自增的)。

       public void InsertOrder(Domain.Entities.Order_Info entity)
        {
            using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                    base.Add(entity);
                    trans.Complete();
                }
                catch (Exception)
                {

                    throw;
                }
            }
        }
           Order_Info entity = new Order_Info
            {
                CreateDate = DateTime.Now,
                UserID = 1,
                Order_Detail = new List<Order_Detail>
                {
                    new Order_Detail
                    {
                      ProductID=1,
                      ProductName="香蕉1"
                    },
                     new Order_Detail
                    {
                      ProductID=2,
                      ProductName="香蕉(jiao)2"
                    }
                }
            };
            new OrderRepository().InsertOrder(entity);

而如果你不建立表關系,你必須自己去做數據插入及orderid賦值的工作,而且更重要的是(shi)(shi)它(ta)生成的SQL代碼的性能是(shi)(shi)低下(xia)的,所(suo)以,使用EF ORM需(xu)要為(wei)數據表(biao)

做關系(xi),不要愉這個懶(lan),因為(wei)這個關系(xi)做的值!

四(si) 這個方法所產生的SQL語句(ju)是我們(men)可以接受的,通過sql profiler進行(xing)代碼(ma)監控,代碼(ma)生成如圖:

 

總結:EF為我們(men)生(sheng)成的SQL語句(ju)只建(jian)立(li)了一次(ci)SQL連接,將insert語句(ju)批量發給sqlserver,而這種(zhong)方式(shi)我們(men)是可以接受的,很多ORM工具對于這種(zhong)情況,將生(sheng)

成(cheng)多次(ci)connection連接,性(xing)能(neng)不言而(er)喻,所(suo)以,EF在代碼(ma)執行效率上(shang)是可以信任的,呵呵。

回到目錄

posted @ 2013-03-07 11:16  張占嶺  閱讀(7243)  評論(6)    收藏  舉報