Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实体数据模型中引入多态性_C#_.net_Entity Framework_Sql Server 2008_Inheritance - Fatal编程技术网

C# 如何在实体数据模型中引入多态性

C# 如何在实体数据模型中引入多态性,c#,.net,entity-framework,sql-server-2008,inheritance,C#,.net,Entity Framework,Sql Server 2008,Inheritance,我使用的数据库模型有以下表格: 摩托车 汽车 飞机 生成ADO.NET实体数据模型edmx文件时,每个表都有一个单独的C#类。上述所有类共享相同的属性(如MaxSpeed)。我想通过创建Vehicle基类,并将公共属性和方法移植到此基类,来介绍一个polimorphism 我无法更改数据库,因为它不支持继承。有没有办法做到这一点 我使用.NET 4.0和SQL Server 2008。如果你按照自己的方式做,那么你会把POCO和域对象搞得一团糟,除非你在EF 4.1中应用代码优先模型驱动的设

我使用的数据库模型有以下表格:

  • 摩托车
  • 汽车
  • 飞机
生成ADO.NET实体数据模型
edmx
文件时,每个表都有一个单独的C#类。上述所有类共享相同的属性(如MaxSpeed)。我想通过创建
Vehicle
基类,并将公共属性和方法移植到此基类,来介绍一个polimorphism

我无法更改数据库,因为它不支持继承。有没有办法做到这一点


我使用.NET 4.0和SQL Server 2008。

如果你按照自己的方式做,那么你会把POCO和域对象搞得一团糟,除非你在EF 4.1中应用代码优先模型驱动的设计。

如果你真的不能更改数据库,那么你必须做的就是按具体类继承表,但这很棘手

宽大处理在行动中起到了一定的作用,这似乎真的很好。一般来说,每种混凝土类型的表都有一个问题,即每种混凝土类型的汽车、飞机、摩托车都必须有唯一的键。换句话说,如果有一辆id为5的汽车,那么就不可能有摩托车或飞机具有该id。因此,对于三个表,您可能必须使用GUID,或者正如Ladislav所指出的,在标识列上适当地设置种子和增量值(种子=1、2和3,增量=3)


理想情况下,您希望(更改数据库并)添加一个具有公共属性的新表,并将其作为基类,车辆、汽车等都继承该属性。EF更容易支持称为每个层次表的方法

您可以得到的最接近的方法是使用表/实体方法


但接下来需要一个Vehicle表来存储ID和公共属性。这就产生了一个问题:您的ID是如何存储的?每个表都有自己的id吗?那么我认为使用实体等级制是不可能的。如果您可以更改此设置,则可以使用每个实体的表。

您最好使用接口来提供对实体的访问。实体代码是自动生成的,因此您不必经历太多重复代码,您可以编写方法,使用该接口以通用方式处理类。

每个具体类示例的表(使用EF 4.1 CodeFirst):谢谢,我如何告诉EF我希望每个层次都有这样的表?在线上有很多关于每个层次的表的例子-这里有一个,这里有另一个,你不需要GUI。您仍然可以在数据库中使用标识列,但必须设置seed和increment以获得disjunct sequence=>seeds 1、2、3和increment 3。