当前位置:编程学习 > C#/ASP.NET >>

EntityFramework中继承类的导航属性

在entityframework中有两个实体类a,b,这两个类在数据库中都有对应的表,其中b继承a,其中b类中没有主键,b对应的数据表中的主键映射到a类的主键字段上。在b中有一个导航属性c(b为主键,c为依赖建)

执行以下代码是有异常:

dbContext.set<b>().include(b=>b.c);
dbContext.where(b=>b.Id == 1).ToList();

异常信息:
指定表达式的 ResultType 与要求的类型不兼容。表达式 ResultType 为“a”,但要求的类型为“b"

请教达人,如何在查询中Include子类的导航属性 --------------------编程问答-------------------- 没人知道吗? --------------------编程问答-------------------- 估计得需要更多信息。
没看到你的代码返回A了。怎么会提示这样的错误。 --------------------编程问答-------------------- 我记得Include()的参数是导航属性的名称字符串,要象这样用:.Include("c")

这是唯一一个可以在LINQ to Entity中使用的Entity Query Builder Methods

--------------------编程问答--------------------
引用 3 楼 abbey 的回复:
我记得Include()的参数是导航属性的名称字符串,要象这样用:.Include("c")

这是唯一一个可以在LINQ to Entity中使用的Entity Query Builder Methods

entity framework的dbcontext扩展了include的expression的参数 --------------------编程问答--------------------
引用 2 楼 findcaiyzh 的回复:
估计得需要更多信息。
没看到你的代码返回A了。怎么会提示这样的错误。

因为b继承了a,而且b的主键也是继承于a,b的导航属性c是通过a的ID进行关联的 --------------------编程问答-------------------- 能给出你定义的A、B和C三个Poco类声明吗? --------------------编程问答--------------------
引用 6 楼 abbey 的回复:
能给出你定义的A、B和C三个Poco类声明吗?


代码很多,我写个大概

public class a
{
    public int Id{set;get;} //主键
}

public class b : a
{
    public virtual Icollection<c> c{set;get;} //b的导航属性c
}

public class c
{
    public int Id{set;get;} //;主键

    public int BId{set;get} //b的主键,即从a继承的Id


    public virtual b b{set;get;}
} --------------------编程问答-------------------- 刚去ADO.NET的Blog去找了找新的Include定义,我看上面这样定义的Poco关系,执行下面这样的查询应该可以啊
var query = context.Set<B>().Include(b => b.c).Where(w => w.Id == 1);


是不是你其他地方还设置有他们三者之间的关系? --------------------编程问答-------------------- A派生B,B:C = 1:M,我从你给的代码得到的关系是这样的。 --------------------编程问答-------------------- 我又想了想,这里还应该再加个外键的修饰
[ForeignKey("b")]
public int BId { set; get; } //b的主键,即从a继承的Id
public virtual B b { set; get; }
--------------------编程问答--------------------
引用 10 楼 abbey 的回复:
我又想了想,这里还应该再加个外键的修饰
C# code
[ForeignKey("b")]
public int BId { set; get; } //b的主键,即从a继承的Id
public virtual B b { set; get; }


没用的,异常还在 --------------------编程问答-------------------- 最近我也在学习Code First,所以我特定把你的代码片放在VS2010了试了试

这是POCO类


这是Main里的查询


这是对应的实体数据模型


上述代码能通过编译并正常运行,只是没有Seed数据,因此query为null。 --------------------编程问答-------------------- Code First是什么 --------------------编程问答-------------------- 问一下,啥是导航属性呢?
补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,