Inheritance 类是否可以从实体框架类继承,并且仍然可以使用继承的类映射持久化回DB?

Inheritance 类是否可以从实体框架类继承,并且仍然可以使用继承的类映射持久化回DB?,inheritance,entity-framework-4,mapping,self-tracking-entities,Inheritance,Entity Framework 4,Mapping,Self Tracking Entities,类是否可以从实体框架类继承,并且仍然可以使用继承的类映射持久化回DB?当我尝试保存声明类型没有任何映射的更改时,我在尝试从“自跟踪实体”类派生时收到错误。我本来希望,由于该类型是从实体类继承的,因此它也可以以某种方式继承实体映射,从而使其正常工作。有人能让这个工作吗 我尝试支持的场景是在另一个程序集中扩展实体对象,该程序集中引用了包含实体和映射的程序集。分部类和映射被编译到包含实体对象的程序集中。因此,我无法通过使用分部类来实现这一点。除非您真的需要覆盖某些数据或默认功能,否则最好的办法就是扩展

类是否可以从实体框架类继承,并且仍然可以使用继承的类映射持久化回DB?当我尝试保存声明类型没有任何映射的更改时,我在尝试从“自跟踪实体”类派生时收到错误。我本来希望,由于该类型是从实体类继承的,因此它也可以以某种方式继承实体映射,从而使其正常工作。有人能让这个工作吗


我尝试支持的场景是在另一个程序集中扩展实体对象,该程序集中引用了包含实体和映射的程序集。分部类和映射被编译到包含实体对象的程序集中。因此,我无法通过使用分部类来实现这一点。

除非您真的需要覆盖某些数据或默认功能,否则最好的办法就是扩展该类。由于EF类声明为
partial
,因此您可以创建另一个代码文件,并将自定义方法或属性放入其中。然后,您将获得所有对象持久性以及自定义代码

public partial class MyEntity
{
   //Extend the base object
   public string FormattedName
   {
      get
      {
         return String.Format("Lookie this! {0}/{1}", this.SomeString, this.SomeInt);
      }
   }
}

编辑——作为对您的澄清的回应,如果您需要修改另一个程序集中的EF类,您最好的选择是创建一个以实体类为成员的包装类。然后,您将编写所有新功能来访问装箱实体的公共部分。它不会为您提供新属性的持久性,但您无论如何也不会得到它。

除非您确实需要覆盖某些数据或默认功能,否则最好的选择是只扩展类。由于EF类声明为
partial
,因此您可以创建另一个代码文件,并将自定义方法或属性放入其中。然后,您将获得所有对象持久性以及自定义代码

public partial class MyEntity
{
   //Extend the base object
   public string FormattedName
   {
      get
      {
         return String.Format("Lookie this! {0}/{1}", this.SomeString, this.SomeInt);
      }
   }
}

编辑——作为对您的澄清的回应,如果您需要修改另一个程序集中的EF类,您最好的选择是创建一个以实体类为成员的包装类。然后,您将编写所有新功能来访问装箱实体的公共部分。它不会为您提供新属性的持久性,但您无论如何也无法获得它。

不,对于EDMX(和自跟踪实体),这是不可能的。如果要存储派生类型,则还必须对其进行映射。如果需要向生成的代码添加任何内容,请使用实体类中自己的部分


令人惊讶的是,代码优先(EFv4.1和DbContext API)似乎是可能的,但在这种情况下,您不能使用自跟踪实体。我只是检查了数据库,不可能先使用代码。它以静默方式创建TPH继承,并将派生类映射为另一个实体。

否EDMX(和自跟踪实体)不可能这样做。如果要存储派生类型,则还必须对其进行映射。如果需要向生成的代码添加任何内容,请使用实体类中自己的部分


令人惊讶的是,代码优先(EFv4.1和DbContext API)似乎是可能的,但在这种情况下,您不能使用自跟踪实体。我只是检查了数据库,不可能先使用代码。它以静默方式创建TPH继承,并将派生类映射为另一个实体。

这太浪费时间了。这意味着您必须提前知道所有派生类。无法实现实体与EF的松耦合。这太浪费时间了。这意味着您必须提前知道所有派生类。无法实现实体与EF的松耦合。