一个类可以从实体框架类继承并仍然使用继承的类映射保留回数据库吗?当我尝试从“自我跟踪实体”类派生时收到错误消息,并且 SaveChanges 指出该类型没有任何映射。由于 Type 是从 Entity 类继承的,因此我希望它也可以以某种方式继承实体映射以使其正常工作。有没有人能让这个工作?
我试图支持的方案是在另一个程序集中扩展实体对象,该程序集引用包含实体和映射的程序集。部分类和映射被编译到包含实体对象的程序集中。所以我不能通过使用部分类来实现这一点。
一个类可以从实体框架类继承并仍然使用继承的类映射保留回数据库吗?当我尝试从“自我跟踪实体”类派生时收到错误消息,并且 SaveChanges 指出该类型没有任何映射。由于 Type 是从 Entity 类继承的,因此我希望它也可以以某种方式继承实体映射以使其正常工作。有没有人能让这个工作?
我试图支持的方案是在另一个程序集中扩展实体对象,该程序集引用包含实体和映射的程序集。部分类和映射被编译到包含实体对象的程序集中。所以我不能通过使用部分类来实现这一点。
不,EDMX(和自我跟踪实体)是不可能的。如果要存储派生类型,它也必须被映射。如果您需要向生成的代码添加任何内容,请使用您自己的实体类部分。
令人惊讶的是,使用代码优先(EFv4.1 和 DbContext API)似乎是可能的,但在这种情况下,您不能使用自我跟踪实体。我刚刚检查了数据库,代码优先也是不可能的。它默默地创建 TPH 继承,并将派生类映射为另一个实体。
除非您确实需要覆盖某些数据或默认功能,否则最好的选择是扩展类。由于 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 类,最好的办法是创建一个以 Entity 类作为成员的包装类。然后,您将编写所有新功能来访问盒装实体的公共部分。它不会为您提供新属性的持久性,但无论如何您都没有得到。