2012年6月3日星期日

Entity Framework多表对一实体,一表对多实体的实现

Entity Framework多表对一实体,一表对多实体的实现

本文中所涉及的全部代码http://files.cnblogs.com/xupng/WebApplication1.rar

介绍多表映射单实体和单表映射多实体的业务场景。

Entity Framework 4.0中多表映射单实现和表映射多实体的实现方法。

对于复杂的可扩展的业务来说,实体和表不一定是一一对应的,一个数据表或能对应多个实体或多个表映射为一个实体的情况特别常见。在这里介绍一些业务场景中会出现这些特殊的情况:
一个数据表对应多个实体:通常当实体具有继承的特性时,我们会使用一个表对应多个实体,这里举例在有三个实体人、教师、学生,他们都有姓名,性别,年龄等等相同的字段,所以我在数据库中想存到一张表dbo.Persons表中,这里要注意一个字段Discriminator鉴别字段,ORM就是通过这个字段鉴别出应该映射到哪个实体的。

image
另一个场景,一个订单的实体,有可能会有很多属性,而且随着需求的变化,有可能会有更多的属性增加进来,所以我希望在存储上使用多张表进行存储,这里我使用一个实体Order,表的话可以是dbo.Orders,dbo.OrderExtend等等这些,定义Order表的Id为主键,OrderExtend中OrderId为主键。

image

在上面两种场景中,我隔离了数据库的变化对业务带来的影响,将这些变化交给ORM去解决,接下来我就详细说一下具体的实现方法:
首先我们创建实体模型,做一个Database To Model的操作,从数据库生成,点下一步就可以了,这里就不多说了,完成后默认会出现如下三个实体

接下来我们要将Order相关的做改成一个实体,将Person实体映射到两个表中。

1.我们将Extend1和Extend2剪切到Orders中,如下图所示:

image

2.打开映射面板,在这里增加表映射。

image

接下来在设计器中删除掉OrderInfo和OrderExtend实体。这时我们就完成了单实体对多个数据表的映射。我们写一段测试代码看一下:

            Database1Entities entities = new Database1Entities();            Orders orders = entities.Orders.CreateObject();            orders.Extend1 = "Extend1";            orders.Extend2 = "Extedn2";            orders.OrderName = "测试订单";            orders.OrderNum = "0123456789";            entities.Orders.AddObject(orders);            entities.SaveChanges();

我们接下来将Persons表映射成为多个实体:

删除Discriminator,然后将Persons设为抽象类

imageimage

下面我们将创建Techer和Student两个子类,继承自Persons,并Techer的映射条件处添加条件,当Discriminator==1,在Student的映射条件处添加条件当Discriminator=2好了,经过这样的设置就可完成了将一个数据表对应多个实体的功能。

imageimage

下面我们看一下测试代码

        protected void Button2_Click(object sender, EventArgs e)        {            Techer techer = new Techer();            techer.Age = 45;            techer.Name = "老师1";            techer.Six = true;            entities.Persons.AddObject(techer);            entities.SaveChanges();        }        protected void Button3_Click(object sender, EventArgs e)        {            Student student = new Student();            student.Age = 12;            student.Name = "张三";            student.Six = true;            entities.Persons.AddObject(student);            entities.SaveChanges();        }

TAG: