在ORM的实体框架中多为继承,关联等
在Hibernater中关联的实体,需要配置 xml文件来维护不同实体的关系
而在EF中这这是通过可视化的图形操作来控制之间的关系的:如下图
关联映射
如已经通过PowerDeesigner画好了实体间的关系 ,实体关系在转成物理模型导入数据库。通过EF的model模型从数据库导入图2
选择好数据库,选择好实体框架,注意这里的框架是和Framework对应的
重点来了
我们看到 有(在模型中包括外键列)若选择该列,这就会在有关联关系的实体中添加外键列。则在添加实体时就要手动添加维护该值,首先我选择的是不包括。我们看具体的关系
不显示外键关联
那么我们如何编码呢
首先我们创建一个客户类
TestEFEntities db = new TestEFEntities();
Customers cus = new Customers
{
CusName="hanhanxml",
CusterId = Guid.NewGuid().ToString()// a0818e4d-9ccd-48ea-b70a-88a78bf3113c
};
db.Customers.Add(cus);
db.SaveChanges();
这样就创建了一个客户信息
下面就是客户购物的定单了
缺点:
这种没有显示外键的关联是无法单表添加,只能实现关联表添加(或许是我认识浅薄,希望大师指点)
外键关联
方式1 在模型中添加关联
添加方式2 数据库中有关系,直接从数据库中导入
优点:
这种方式即可实现单表添加,也可实现关联表同时添加。
实例代码
TestEFEntities db = new TestEFEntities();
Customers cus = new Customers
{
CusName = "hanhan",
CusterId = Guid.NewGuid().ToString()//678d0b30-321a-4c72-9ec3-1f8c7f3c254b
};
OrderInfoes order = new OrderInfoes//单向在订单表中添加数据
{
content="Hanhan",
OrderId=Guid.NewGuid().ToString(),
OrderName="hanhamxml",
CustomersCusterId=cus.CusterId,//查询关联属性外键值
};
OrderInfoes order2 = new OrderInfoes//同时插入两个表 ,定单和客户表(客户表中插入了客户数据)
{
content = "Hanhan",
OrderId = Guid.NewGuid().ToString(),
OrderName = "hanhamxml",
Customers = cus
};
// db.Customers.Add(cus);
db.OrderInfoes.Add(order);
db.SaveChanges();
继承映射
在EF模型中继承用的是一对一的映射,而到了数据库则是每个子类一张表,存放子类所特有的属性实例图
优缺点:
这种设计方式完全符合关系模型的设计原则,且不存在冗余,维护起来比较方便,对每个类的修改只需要修改其所对应的表,灵活性很好,完全是参照对象继承的方式进行配置,对于父类的查询需要使用左外链接,对于子类查询需要使用内链接,对于子类的持久话至少要处理两个表
模型图
数据库关系图
两个表通过唯一主键进行关联,这样就是同时插入两个表数据了
代码
TestEFEntities db = new TestEFEntities();
Customers cus = new Customers
{
CusName="hanhan3",
CusterId=Guid.NewGuid().ToString()
};
OrderInfoes order = new OrderInfoes
{
content="hanhan2",
CusterId = cus.CusterId,
CusName = cus.CusName,
OrderId=Guid.NewGuid().ToString(),
OrderName="hanhan5"
};
db.OrderInfoes.Add(order);//同时添加俩表
db.SaveChanges();
var orders=db.OrderInfoes.AsQueryable();//查询子类所有数据
foreach (var item in orders)
{
Console.WriteLine(item.CusName);//查询数据,父类的名称
}
小结:
通过以上两点我们看到,实体映射框架几乎是大同小异,若你了解Hibernate,那么对于EF的实体映射方面上手是很容易的