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)是可以信任的,呵呵。