EntityFramework中继承类的导航属性

saber_mm 2012-02-10 06:28:56
在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子类的导航属性
...全文
834 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
问一下,啥是导航属性呢?
saber_mm 2012-02-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 abbey 的回复:]

我又想了想,这里还应该再加个外键的修饰
C# code
[ForeignKey("b")]
public int BId { set; get; } //b的主键,即从a继承的Id
public virtual B b { set; get; }
[/Quote]

没用的,异常还在
sugarbelle 2012-02-11
  • 打赏
  • 举报
回复
Code First是什么
老毕 2012-02-11
  • 打赏
  • 举报
回复
最近我也在学习Code First,所以我特定把你的代码片放在VS2010了试了试

这是POCO类


这是Main里的查询


这是对应的实体数据模型


上述代码能通过编译并正常运行,只是没有Seed数据,因此query为null。
老毕 2012-02-10
  • 打赏
  • 举报
回复
我又想了想,这里还应该再加个外键的修饰
[ForeignKey("b")]
public int BId { set; get; } //b的主键,即从a继承的Id
public virtual B b { set; get; }
老毕 2012-02-10
  • 打赏
  • 举报
回复
A派生B,B:C = 1:M,我从你给的代码得到的关系是这样的。
老毕 2012-02-10
  • 打赏
  • 举报
回复
刚去ADO.NET的Blog去找了找新的Include定义,我看上面这样定义的Poco关系,执行下面这样的查询应该可以啊
var query = context.Set<B>().Include(b => b.c).Where(w => w.Id == 1);


是不是你其他地方还设置有他们三者之间的关系?
saber_mm 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 abbey 的回复:]

能给出你定义的A、B和C三个Poco类声明吗?
[/Quote]

代码很多,我写个大概

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;}
}
老毕 2012-02-10
  • 打赏
  • 举报
回复
能给出你定义的A、B和C三个Poco类声明吗?
saber_mm 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 findcaiyzh 的回复:]

估计得需要更多信息。
没看到你的代码返回A了。怎么会提示这样的错误。
[/Quote]
因为b继承了a,而且b的主键也是继承于a,b的导航属性c是通过a的ID进行关联的
saber_mm 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 abbey 的回复:]

我记得Include()的参数是导航属性的名称字符串,要象这样用:.Include("c")

这是唯一一个可以在LINQ to Entity中使用的Entity Query Builder Methods
[/Quote]
entity framework的dbcontext扩展了include的expression的参数
老毕 2012-02-10
  • 打赏
  • 举报
回复
我记得Include()的参数是导航属性的名称字符串,要象这样用:.Include("c")

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

宝_爸 2012-02-10
  • 打赏
  • 举报
回复
估计得需要更多信息。
没看到你的代码返回A了。怎么会提示这样的错误。
saber_mm 2012-02-10
  • 打赏
  • 举报
回复
没人知道吗?
关于EF6的正式书籍很少,这个文章是国内翻译整理出来的,共46个小节。适合循序渐进的学习。 第1部分 开始使用实体框架之历史和框架简述 第2部分 开始使用实体框架之使用介绍 第3部分 实体数据建模基础之创建一个简单的模型 第4部分 实体数据建模基础之从已存在的数据库创建模型 第5部分 实体数据建模基础之有载荷和无载荷的多对多关系建模 第6部分 实体数据建模基础之使用Code First建模自引用关系 第7部分 实体数据建模基础之拆分实体到多表以及拆分表到多实体 第8部分 实体数据建模基础之继承关系映射TPT 第9部分 实体数据建模基础之继承关系映射TPH 第10部分 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射 第11部分 查询之异步查询 第12部分 查询之使用SQL语句 第13部分 查询之使用Entity SQL 第14部分 查询之查询设置默认值和存储过程返回多结果集 第15部分 查询之与列表值比较和过滤关联实体 第16部分 查询之左连接和在TPH通过派生排序 第17部分 查询之分页、过滤和使用DateTime的日期部分分组 第18部分 查询之结果集扁平化和多属性分组 第19部分 查询之使用位操作和多属性连接(join) 第20部分 ASP.NET MVC使用实体框架之在MVC构建一个CRUD示例 第21部分 ASP.NET MVC使用实体框架之在页面创建查询和使用ASP.NET URL路由过虑 第22部分 加载实体和导航属性之延迟加载 第23部分 加载实体和导航属性之预先加载与Find()方法 第24部分 加载实体和导航属性之查询内存对象 第25部分 加载实体和导航属性之加载完整的对象图和派生型上的导航属性 第26部分 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作使用Include()方法 第27部分 加载实体和导航属性之关联实体过滤、排序、执行聚合操作 第28部分 加载实体和导航属性之测试实体是否加载与显式加载关联实体 第29部分 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联 第30部分 继承与建模高级应用之多对多关联 第31部分 继承与建模高级应用之自引用关联 第32部分 继承与建模高级应用之TPH与TPT (1) 第33部分 继承与建模高级应用之TPH与TPT (2) 第34部分 继承与建模高级应用之多条件与QueryView 第35部分 继承与建模高级应用之TPH继承映射使用复合条件 第36部分 继承与建模高级应用之TPC继承映射 第37部分 继承与建模高级应用之独立关联与外键关联 第38部分 使用对象服务之动态创建连接字符串和从数据库读取模型 第39部分 使用对象服务之配置模型和使用单复数服务 第40部分 使用对象服务之从跟踪器获取实体与从命令行生成模型(想解决EF第一次查询慢的,请阅读) 第41部分 使用对象服务之标识关系使用依赖实体与异步查询保存 第42部分 POCO之使用POCO 第43部分 POCO之使用POCO加载实体 第44部分 POCO之POCO使用值对象和对象变更通知 第45部分 POCO之获取原始对象与手工同步对象图和变化跟踪器 第46部分 POCO之领域对象测试和仓储测试

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧