我正在使用 Entity Framework 5.0 和代码优先方法以及由 Table Per Hierarchy 表示的业务对象的继承。
我想有以下结构:
//Assembly 'DataAccess'
public class MyDbContext : DbContext
{
DbSet<AbstractClass> CommonObjects.AbstractClasses { get; set; }
}
//Assembly 'CommonObjects'
public abstract class AbstractClass
{
//implementation
}
//Assembly 'DerivedObjects'
public class DerivedClass : AbstractClass
{
//implementation
}
在运行时,当第一次尝试访问 DbContext 时,编译器会抛出一个 InvalidOperationException 说:
抽象类型“CommonObjects.AbstractClass”没有映射的后代,因此无法映射。从模型中删除“CommonObjects.AbstractClass”或将一种或多种派生自“CommonObjects.AbstractClass”的类型添加到模型中。
这种情况甚至可能吗?如果是,我做错了什么?
提前感谢您的回答。
本
附加信息:
也许我应该更具体一点:
我得到了一个包含我的抽象业务对象(仅抽象)的程序集。具体实现(包含逻辑)保存在负责的程序集中,因为它们的逻辑取决于该程序集中的其他类。问题是,我也希望能够将这些具体实现存储在持久层中。但为此,EF 必须知道这些类型才能启用映射。但我不想让持久层依赖于我的业务逻辑层——只有抽象。
这就是我尝试直接从业务对象层将派生对象添加到 DbContext 的原因。
例子:
AbstractClass derivedClass = new DerivedClass();
MyDbContext.AbstractClasses.Add(derivedClass);
但是随后抛出了上面的异常。我只是想不出一个好的结构来实现这一点。