ASP.NET C#EF - 如何选择后的完整的对象受益?(ASP.NET C# EF - How

2019-10-17 05:50发布

我一直工作在ASP.NET C#与实体框架和一些人帮助我非常多的某些关键点。

还有一点我也不能完全理解。 难道我们不应该当我们检索EF数据使用对象和它的子对象(外键关系表数据)?

这里是我的数据库设计(这也是显示在我前面回答的问题)

在我的代码,我只是得到这样的会员单位:

//In some aspx.cs file
var Mem = new MemberManager().GetById(2);

//In MemberManager class
public Member GetById(long id)
        {
            using(var Context = new NoxonEntities())
            {
                return Context.Member.First(c => c.Id == id);
            }
        }

当我这样做:

var Mem = new MemberManager().GetById(2);
var Lang = Mem.Language;
//I get 
//Error: 'Mem.Language' threw an exception of type 'System.ObjectDisposedException'

为了摆脱这种例外,我需要做到这一点的:

public Member GetById(long id)
        {
            using(var Context = new NoxonEntities())
            {
                var Result = Context.Member.First(c => c.Id == id);
                //Getting the Language Entity
                Result.Language = Context.Language.First(c => c.Id == Result.LanguageId);

                return Result;
            }
        }

我一定要为了有充分的实体运行SELECT? 如果有什么有另一相关表语言表可以说功能表。 我应该这样做:

public Member GetById(long id)
            {
                using(var Context = new NoxonEntities())
                {
                    var Result = Context.Member.First(c => c.Id == id);
                    //Getting the Language Entity
                    Result.Language = Context.Language.First(c => c.Id == Result.LanguageId);
                    Result.Language.Feature = Context.Language.Feature.First(c => c.Id == Result.FeatureId);
                    return Result;
                }
            }

这可以去verrry长,我敢肯定(至少我真的希望)我是错的东西,但如果我们不能使用对象和它的子对象选择 ,什么是具有EF的目的是什么? 我们只能使用在网站的子对象using(var Context = new NoxonEntities())块?

谢谢,

Answer 1:

想想上下文数据库连接。 当您创建的背景下这样连接提供给你using的语句,并把它扔掉,在结束using 。 后一切using块不能再访问该数据库的连接。 在这里,你会得到一个异常...

var Lang = Mem.Language;

......因为懒加载尝试加载Language从数据库导航属性,但到数据库的连接已经配置。 你只能在内部使用了这样的延迟加载using块时到数据库的连接仍然是可用的。

您可以简化通过使用预先加载与加载在你的榜样的导航属性Include

public Member GetById(long id)
{
    using(var Context = new NoxonEntities())
    {
        return Context.Member.Include("Language").First(c => c.Id == id);
    }
}

或两者兼有导航属性使用:

return Context.Member.Include("Language.Feature").First(c => c.Id == id);

这将加载部件语言,在一个单一的数据库查询功能。



Answer 2:

你的问题是由于延迟加载。 发生了什么事是,EF没有加载您的相关实体Language ,因为它不知道这将需要的数据。 然后,你配置的背景下,所以当你试图访问Language导航属性是无法进行跳转。

您有几种选择这里。 您可以渴望的负载,这里是一个伟大的博客帖子上预先加载,语言实体:

var Result = Context.Member.Include("Language").First(c => c.Id == id);

或者,你需要不断的背景下,活在整个请求。 这里有一个上一个伟大的方法来保持你的背景下活着的每个请求好的职位 。

我记得你的其他职位,但 - 我相信你分离的实体,并存储在别处,然后再重新安装。 如果这是关系到该功能,然后访问您的语言对象,你重新将其连接到一个背景下也将解决您的问题之后



文章来源: ASP.NET C# EF - How to benefit the full object after selecting it?