解决方案 »

  1.   

    Intersect  --> Include 吧数据库没有加外键约束?
      

  2.   

    using System.Data.Entity;
    .Include(x => x.A)主外键的话 A 不会为空的把另外 你不要Using EF  不用关闭 EF会自动关闭的 我通常是开启EF的延迟查询的,当然为了速度会Include因为你可以判断是否为空, 但从数据的角度来说因为主外键是有数据的
     现在没有数据  那说明是有问题的
    所以我情愿他报异常
      

  3.   

    对是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 初始化之后就再也不释放么?
    我想知道你们遇到的时候怎么处理的
      

  4.   


    你说的确实在理,但是数据库设计中,外表字段是可为空的,同样也会存在这样的业务,将某些外键为空,他没有对应的主键
    (你不要Using EF  不用关闭 EF会自动关闭的 ) 这个也只是仅限于调用DBContext的时候
    倘若我们离开了DBContext类库就像现在的MVC 模板上遍历一样@Foreach(var item in BList)
    {
    if(item.A==null)
    {
    <span>未绑定</span>
    }
    else
    {
    <span>@item.A.Name</span>
    }
    }这种业务也是很常见的对吧
      

  5.   

    试验了下,我这里如果Include了A,之后不管A是不是空,EF都不会再查询了。不Include的时候取值时才会lazy loading那个A。不清楚为什么你那里Include之后还试图查询空值。不过这个问题在于查询的结果是EF自动生成的代理对象,取A的时候它试图使用lazy loading的方式。如果用AsNoTracking,或者ctx.Configuration.ProxyCreationEnabled = false都可以避免取A的时候再查询。
      

  6.   

    我之前认同这个作者 不用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的默认机制 失去引用啊什么的