entity frameworks給我們代來的不只是操作方便,代碼簡潔,代碼人性化強,而且更重要的是它的代碼執行效率也是可以信任的,這一點對於我們來說十分重要,因為對於ORM來說,你再使用方便,再容易上手,如果你的性能低下,我估計也沒人愛用,呵呵。
今天主要說一下entity frameworks中的關聯表插入問題,我們以訂單業務為例來說一下:
一 數據結果圖如下:

二 在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; } } }
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="香蕉2" } } }; new OrderRepository().InsertOrder(entity);
而如果你不建立表關系,你必須自己去做數據插入及orderid賦值的工作,而且更重要的是它生成的SQL代碼的性能是低下的,所以,使用EF ORM需要為數據表
做關系,不要愉這個懶,因為這個關系做的值!
四 這個方法所產生的SQL語句是我們可以接受的,通過sql profiler進行代碼監控,代碼生成如圖:
總結:EF為我們生成的SQL語句只建立了一次SQL連接,將insert語句批量發給sqlserver,而這種方式我們是可以接受的,很多ORM工具對於這種情況,將生
成多次connection連接,性能不言而喻,所以,EF在代碼執行效率上是可以信任的,呵呵。
