5

我正在使用 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); 

但是随后抛出了上面的异常。我只是想不出一个好的结构来实现这一点。

4

0 回答 0