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;
}
}
}
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進行代碼監控,代碼生成如圖: