天天看點

EF架構~簡潔關聯表插入,優越的代碼性能!

entity frameworks給我們代來的不隻是操作友善,代碼簡潔,代碼人性化強,而且更重要的是它的代碼執行效率也是可以信任的,這一點對于我們來說十分重要,因為對于ORM來說,你再使用友善,再容易上手,如果你的性能低下,我估計也沒人愛用,呵呵。

今天主要說一下entity frameworks中的關聯表插入問題,我們以訂單業務為例來說一下:

一 資料結果圖如下:

EF架構~簡潔關聯表插入,優越的代碼性能!

二 在EF中,資料結構關聯圖會展現在模型裡,并且同時會生成在實體中,它以導航屬性的形式出現,如圖:

EF架構~簡潔關聯表插入,優越的代碼性能!
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; }
    }      

三 使用我們封裝好的Add方法,将order_info實體插入,如果order_info裡的Order_Detail屬性的Count大于0,将會建立Order_info對象的add方法,這一切

由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指派,如果它們已經存在了表關聯,那麼在order_detail裡,你不需要為orderid指派,因為它在.net環境中,還沒有确定值

(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;
                }
            }
        }      
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="香蕉2"
                    }
                }
            };
            new      

而如果你不建立表關系,你必須自己去做資料插入及orderid指派的工作,而且更重要的是它生成的SQL代碼的性能是低下的,是以,使用EF ORM需要為資料表

做關系,不要愉這個懶,因為這個關系做的值!

四 這個方法所産生的SQL語句是我們可以接受的,通過sql profiler進行代碼監控,代碼生成如圖:

EF架構~簡潔關聯表插入,優越的代碼性能!