C# EF 4.3.1在LinqToEntities查询中包含继承的导航属性

C# EF 4.3.1在LinqToEntities查询中包含继承的导航属性,c#,inheritance,ef-code-first,entity-framework-4.3,navigation-properties,C#,Inheritance,Ef Code First,Entity Framework 4.3,Navigation Properties,我正在尝试使用EF4.3.1使用代码优先方法和fluent配置设置一个简单的继承场景 我创建了一个具有一对一导航属性的抽象基类型“A”,以及一个具有一对一导航属性的继承类“AA”,它具有以下特性: public abstract class A { public Guid ID { get; set; } public B ChildB { get; set; } } public class AA : A { public C ChildC { get; set; }

我正在尝试使用EF4.3.1使用代码优先方法和fluent配置设置一个简单的继承场景

我创建了一个具有一对一导航属性的抽象基类型“A”,以及一个具有一对一导航属性的继承类“AA”,它具有以下特性:

public abstract class A
{
    public Guid ID { get; set; }
    public B ChildB { get; set; }
}

public class AA : A
{
    public C ChildC { get; set; }
}

public class B
{
    public Guid ID { get; set; }
    public A Parent { get; set; }
}

public class C
{
    public Guid ID { get; set; }
    public AA Parent { get; set; }
}

public class AConfiguration : EntityTypeConfiguration<A>
{
    public AConfiguration()
    {
        this.HasRequired(o => o.ChildB)
            .WithRequiredPrincipal(o => o.Parent);

        this.Map(o =>
        {
            o.ToTable("A");
        });
    }
}

public class AAConfiguration : EntityTypeConfiguration<AA>
{
    public AAConfiguration()
    {
        this.HasRequired(o => o.ChildC)
            .WithRequiredPrincipal(o => o.Parent);

        this.Map(o =>
        {
            o.ToTable("AA");
        });
    }
}

public class BConfiguration : EntityTypeConfiguration<B>
{
    public BConfiguration()
    {
        this.HasRequired(o => o.Parent)
            .WithRequiredDependent(o => o.ChildB);

        this.Map(o =>
        {
            o.ToTable("B");
        });
    }
}

public class CConfiguration : EntityTypeConfiguration<C>
{
    public CConfiguration()
    {
        this.HasRequired(o => o.Parent)
            .WithRequiredDependent(o => o.ChildC);

        this.Map(o =>
        {
            o.ToTable("C");
        });
    }
}

public class DataContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add<A>(new AConfiguration());
        modelBuilder.Configurations.Add<AA>(new AAConfiguration());
        modelBuilder.Configurations.Add<B>(new BConfiguration());
        modelBuilder.Configurations.Add<C>(new CConfiguration());
    }

    public DbSet<AA> AASet { get; set; }
    public DbSet<B> BSet { get; set; }
    public DbSet<C> CSet { get; set; }
}
... dataContext.AASet.Include("ChildC") ...
但当我尝试包含继承类型的导航属性时,如下所示:

public abstract class A
{
    public Guid ID { get; set; }
    public B ChildB { get; set; }
}

public class AA : A
{
    public C ChildC { get; set; }
}

public class B
{
    public Guid ID { get; set; }
    public A Parent { get; set; }
}

public class C
{
    public Guid ID { get; set; }
    public AA Parent { get; set; }
}

public class AConfiguration : EntityTypeConfiguration<A>
{
    public AConfiguration()
    {
        this.HasRequired(o => o.ChildB)
            .WithRequiredPrincipal(o => o.Parent);

        this.Map(o =>
        {
            o.ToTable("A");
        });
    }
}

public class AAConfiguration : EntityTypeConfiguration<AA>
{
    public AAConfiguration()
    {
        this.HasRequired(o => o.ChildC)
            .WithRequiredPrincipal(o => o.Parent);

        this.Map(o =>
        {
            o.ToTable("AA");
        });
    }
}

public class BConfiguration : EntityTypeConfiguration<B>
{
    public BConfiguration()
    {
        this.HasRequired(o => o.Parent)
            .WithRequiredDependent(o => o.ChildB);

        this.Map(o =>
        {
            o.ToTable("B");
        });
    }
}

public class CConfiguration : EntityTypeConfiguration<C>
{
    public CConfiguration()
    {
        this.HasRequired(o => o.Parent)
            .WithRequiredDependent(o => o.ChildC);

        this.Map(o =>
        {
            o.ToTable("C");
        });
    }
}

public class DataContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add<A>(new AConfiguration());
        modelBuilder.Configurations.Add<AA>(new AAConfiguration());
        modelBuilder.Configurations.Add<B>(new BConfiguration());
        modelBuilder.Configurations.Add<C>(new CConfiguration());
    }

    public DbSet<AA> AASet { get; set; }
    public DbSet<B> BSet { get; set; }
    public DbSet<C> CSet { get; set; }
}
... dataContext.AASet.Include("ChildC") ...
我在运行时获得EntityCommandCompilationException,其中包含以下内部异常消息:

指定表达式的ResultType与 必需的类型。表达式ResultType为 “Transient.reference[…A]”但所需类型为 “暂时性引用[…AA]”。参数名称:参数[0]

有没有人遇到过类似的问题

我可能遗漏了一些东西,但我看不出这个样本有什么问题


我该怎么做才能使我的模型按预期工作?

不,你不会错过任何东西。实际上,您遇到了一个旧的实体框架错误。您的第二个查询可以这样编写:

var result = dataContext.ASet.OfType<AA>().Include("ChildC").ToList();

但这将生成多个查询。如果您在多个查询中没有性能问题,我希望使用最后一种解决方案,直到您可以迁移到EF 5.0。

Thanx以获得回复Sauma,但是您的第一种解决方案会生成相同的异常,并且我的项目不允许使用显式加载。