entity frameworks给我们代来的不只是操作方便,代码简洁,代码人性化强,而且更重要的是它的代码执行效率也是可以信任的,这一点对于我们来说十分重要,因为对于ORM来说,你再使用方便,再容易上手,如果你的性能低下,我估计也没人爱用,呵呵。
今天主要说一下entity frameworks中的关联表插入问题,我们以订单业务为例来说一下:
一 数据结果图如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CXs0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzEzMmNGZxYTZiBjM1M2NyADOzYWYwYzNkJDNkVzNxIGZiVWZ4czLchDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
二 在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进行代码监控,代码生成如图: