EF包含外键表查询的问题,求助大神!!

黑子大哥 2014-11-11 09:48:20
大神们,小弟遇到一个问题,关于EF的


通常使用EF的时候,这样的结构

A表 ID Name
B表 ID, AID, Name ,AID(A表ID), A (依赖A)为A表外键

A(1)->B(n) 1 对多

BDContext.B.Intersect("A").ToList()
Intersect好像写错了,意思是包含

这样出来结果就会包含有A数据

问题来了,假如某一条B中包含的A是空,在使用的时候就会有出现一个异常,因为BDContext已经释放

当然我相信大家在使用BDContext的时候应该不会将其到处用吧

这种情况怎么处理
我想要的结果 B为空那么就返回空,而不是再次去查询数据库出现BDContext已经释放异常

不知道大家明白了没有!!!
...全文
546 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑子大哥 2014-11-11
  • 打赏
  • 举报
回复
引用 2 楼 moonwrite 的回复:
using System.Data.Entity; .Include(x => x.A) 主外键的话 A 不会为空的把 另外 你不要Using EF 不用关闭 EF会自动关闭的 我通常是开启EF的延迟查询的,当然为了速度会Include 因为你可以判断是否为空, 但从数据的角度来说因为主外键是有数据的 现在没有数据 那说明是有问题的 所以我情愿他报异常
你说的确实在理,但是数据库设计中,外表字段是可为空的,同样也会存在这样的业务,将某些外键为空,他没有对应的主键 (你不要Using EF 不用关闭 EF会自动关闭的 ) 这个也只是仅限于调用DBContext的时候 倘若我们离开了DBContext类库 就像现在的MVC 模板上遍历一样

@Foreach(var item in BList)
{
if(item.A==null)
{
<span>未绑定</span>
}
else
{
<span>@item.A.Name</span>
}
}
这种业务也是很常见的对吧
黑子大哥 2014-11-11
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:
Intersect --> Include 吧 数据库没有加外键约束?
对是Include 我记错了,我这里没环境 手打的
引用 2 楼 moonwrite 的回复:
using System.Data.Entity; .Include(x => x.A) 主外键的话 A 不会为空的把 另外 你不要Using EF 不用关闭 EF会自动关闭的 我通常是开启EF的延迟查询的,当然为了速度会Include 因为你可以判断是否为空, 但从数据的角度来说因为主外键是有数据的 现在没有数据 那说明是有问题的 所以我情愿他报异常
是这样的,A是主键表,B属于外键表,每一个B的实体都包含一个A,当我们这个B表的外键(AID)为空, 举例:A为类别,B为产品,录入产品的时候我们没有选择类别,因此就会出现一个空信息 然而在遍历B列表的时候,我们调用B.A的时候,因为A为空,就会出现DBContext已经释放的问题 我想要的效果是,如果A为空就是空,不要去数据库查询 比如代码:

For(var item in BList)
{
if(item.A==null)//通常A为空 在这里就会报错 DBContext已经释放
{
//处理 该产品没有类别
}
else
{
//输出产品类别
}
}
我想我不可能吧DBContext 初始化之后就再也不释放么? 我想知道你们遇到的时候怎么处理的
moonwrite 2014-11-11
  • 打赏
  • 举报
回复
using System.Data.Entity; .Include(x => x.A) 主外键的话 A 不会为空的把 另外 你不要Using EF 不用关闭 EF会自动关闭的 我通常是开启EF的延迟查询的,当然为了速度会Include 因为你可以判断是否为空, 但从数据的角度来说因为主外键是有数据的 现在没有数据 那说明是有问题的 所以我情愿他报异常
q107770540 2014-11-11
  • 打赏
  • 举报
回复
Intersect --> Include 吧 数据库没有加外键约束?
moonwrite 2014-11-11
  • 打赏
  • 举报
回复
我之前认同这个作者 不用using ef http://www.cnblogs.com/mecity/archive/2011/07/17/2108508.html 而我现在是用IOC builder.Register(x => new xxxDbContext()).As<IDbContext>().InstancePerRequest(); DBContext的生命周期为一次http请求,不再是根据.net的默认机制 失去引用啊什么的
winnowc 2014-11-11
  • 打赏
  • 举报
回复
试验了下,我这里如果Include了A,之后不管A是不是空,EF都不会再查询了。不Include的时候取值时才会lazy loading那个A。不清楚为什么你那里Include之后还试图查询空值。不过这个问题在于查询的结果是EF自动生成的代理对象,取A的时候它试图使用lazy loading的方式。如果用AsNoTracking,或者ctx.Configuration.ProxyCreationEnabled = false都可以避免取A的时候再查询。

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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