利用ORM工具实现单表继承的实践

近拿一个小项目作Entity Framework练手的实例。方法与步骤很简单:新建一个项目,为其添加ADO.NET 实体数据模型,随后利用VS2010提供的ORM工具,设计好数据库的关系图(edmx文件),再利用ORM工具逆向生成数据库的生成脚本(sql文件),最后运行该sql脚本即可生成我们需要的数据库了。

我在这个类似进销存的项目里,使用了继承结构表达货物的进出库记录—即用一个Record实体及其派出生的3个实体类Incoming、Outgoing、Wear来表达之。在数据库的那头,则生成一张表Records,结合单表继承以实现业务逻辑中进库记录、出库记录、损耗记录的结构。

但我采用前述的步骤生成的数据库,却并没有将Record及其派生实体类的字段全部放入Records表中,而是对应Record及其3个派生实体类的结构,在库中生成了4张表。他们分别对应Record、Incoming、Outgoing、Wear四个实体。并且,在Records表与其他3表间,自动利用Record表的PK字段ID建立了表间关系,这使得整个数据库臃肿了许多。

最后,经反复试验了多次,换了若干不同种生成方式,才发现:要较好实现前述TPH,需要在数据库一头先定义这张表,其中包括基类及其派生类的所有字段,然后利用数据库生成ORM模型,再修改ORM模型并添加派生类、建立继承关系、映射关系和映射条件,之后再用ORM模型逆向更新数据库结构,即可达成前述目标。


[注]:单表继承,或称每个层次结构一个表”的继承。我曾在LINQ to SQL的学习笔记中提到过单表继承(http://www.cnblogs.com/Abbey/archive/2011/07/17/2107917.html),但是LINQ to Entity与之有较大的不同,没有鉴别器Attribute的修饰,LINQ to Entity中的单表继承实现相对变化了许多。具体可参见MSDN中的范例:http://msdn.microsoft.com/zh-cn/library/dd793152.aspx


posted @ 2011-11-08 20:42  没头脑的老毕  阅读(642)  评论(0编辑  收藏  举报