Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 实体框架-如何处理表关系?_Asp.net Mvc_Entity Framework - Fatal编程技术网

Asp.net mvc 实体框架-如何处理表关系?

Asp.net mvc 实体框架-如何处理表关系?,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我使用repository模式和LINQtoSQL开发了一个相当小的asp.NETMVC应用程序。我现在想使用实体框架访问和更新相同的数据,但是我很难理解我的语法对于实体框架中的表关系是否正确 假设我正在为一个用户检索一行数据,并且我还希望检索该用户的关联业务(用户表中的外键)。现在我正在做这样的事情: using (MyDatabaseEntities context = new MyDatabaseEntities()) { User user = db.User.FirstOrDe

我使用repository模式和LINQtoSQL开发了一个相当小的asp.NETMVC应用程序。我现在想使用实体框架访问和更新相同的数据,但是我很难理解我的语法对于实体框架中的表关系是否正确

假设我正在为一个用户检索一行数据,并且我还希望检索该用户的关联业务(用户表中的外键)。现在我正在做这样的事情:

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    User user = db.User.FirstOrDefault(u => u.Users.UserId == userId);

    if (!user.BusinessReference.IsLoaded)
    {
        user.BusinessReference.Load();
    }

    return user;
}
从我看到的示例中,我应该执行以下操作来访问业务表数据:

foreach (Business business in user.BusinessReference)
{
    var b = business;
    ViewData["BusinessName"] = b.BusinessName;                    
}

我这样做对吗?如有任何建议,将不胜感激

不,那似乎不太对。这更像是:

User user = db.User.Include("Business").FirstOrDefault(u => u.UserId == userId);

这假设您的用户实体有一个名为Business的导航属性。

不,这似乎不太正确。这更像是:

User user = db.User.Include("Business").FirstOrDefault(u => u.UserId == userId);

这假设您的用户实体有一个名为Business的导航属性。

除了foreach部分之外,foreach部分并没有真正说明您要做什么,因为您正在覆盖ViewData[“BusinessName”]的循环中,您基本上已经掌握了所发生的事情

如果这是一个正在显示的用户,并且您还希望显示一些businessname,那么这些businessname应该在视图中可用。实体框架的枯燥之处以及我选择临时使用其他解决方案的原因是必须加载引用

在您提供的示例中,更好的解决方案可能是:

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    return (from u in user.Include("Business")
            where u.UserId == userId
            select u).FirstOrDefault();
}

不幸的是,您无法以简单的方式预加载任何比这更深的引用,在这种情况下,您需要一路循环并加载。

除了foreach部分之外,foreach部分没有真正说明您要做什么,因为您在循环中覆盖了ViewData[“BusinessName”]你对所发生的一切都很了解

如果这是一个正在显示的用户,并且您还希望显示一些businessname,那么这些businessname应该在视图中可用。实体框架的枯燥之处以及我选择临时使用其他解决方案的原因是必须加载引用

在您提供的示例中,更好的解决方案可能是:

using (MyDatabaseEntities context = new MyDatabaseEntities())
{
    return (from u in user.Include("Business")
            where u.UserId == userId
            select u).FirstOrDefault();
}
不幸的是,您无法以一种简单的方式预加载任何更深的引用,在这种情况下,您需要一路循环并加载。

我会这样做:

  • 为视图创建表示模型,并将视图更改为强类型视图
  • 使用L2E投影到表示模型上
  • 像这样:

    var model = (from u in Context.Users 
                 where u.UserId == userId
                 select new UserPresentation
                 {
                     UserName = u.Name,
                     BusinessName = u.Business.BusinessName,
                     SomeOtherDatumYourViewNeeds = // ...
                 }).FirstOrDefault();
    
    这里有一些要点:

    • 你不必担心急于加载。您需要的数据将始终被加载
    • 您没有要求SQL Server返回您不需要的日期,例如您不希望在视图中显示的用户或业务的属性
    • 视图现在与实体模型解耦。它们都可以独立进化
      • 我会这样做:

      • 为视图创建表示模型,并将视图更改为强类型视图
      • 使用L2E投影到表示模型上
      • 像这样:

        var model = (from u in Context.Users 
                     where u.UserId == userId
                     select new UserPresentation
                     {
                         UserName = u.Name,
                         BusinessName = u.Business.BusinessName,
                         SomeOtherDatumYourViewNeeds = // ...
                     }).FirstOrDefault();
        
        这里有一些要点:

        • 你不必担心急于加载。您需要的数据将始终被加载
        • 您没有要求SQL Server返回您不需要的日期,例如您不希望在视图中显示的用户或业务的属性
        • 视图现在与实体模型解耦。它们都可以独立进化

        所以如果我使用“.Include”我不能包含多个表或关系?例如:User User=db.User.Include(“业务”).Include(“用户角色”).FirstOrDefault(u=>u.UserId==UserId);请注意,Include可能并不急于加载业务(Include是一个“提示”/请求,而不是命令),您绝对需要保留IsLoaded/load代码。此外,您还可以堆叠多个包含。因此,如果我使用包含,在我的控制器中,我现在可以使用如下内容:user.Business.BusinessName.ToString();加载用户对象后。为什么我还需要使用IsLoaded/Load代码?对于这种情况,您不需要,但不能包括任何相关的业务终端。有关更多信息,请参阅。如果我使用“.Include”,我不能包含多个表或关系?例如:User User=db.User.Include(“业务”).Include(“用户角色”).FirstOrDefault(u=>u.UserId==UserId);请注意,Include可能并不急于加载业务(Include是一个“提示”/请求,而不是命令),您绝对需要保留IsLoaded/load代码。此外,您还可以堆叠多个包含。因此,如果我使用包含,在我的控制器中,我现在可以使用如下内容:user.Business.BusinessName.ToString();加载用户对象后。为什么我还需要使用IsLoaded/Load代码?对于这种情况,您不需要,但不能包括任何相关的业务终端。有关更多信息,请参阅,我不认为这真的纠正了原始代码,除了原始代码所做的之外,还请求了一个急切的加载。检查底层生成的SQL查询将是确定哪一个查询的结果“更好”的唯一方法。我认为这并不能真正纠正原始代码,甚至不能在原始代码的基础上请求一个急切的加载。检查底层生成的SQL查询将是确定哪一个查询结果“更好”的唯一方法。非常好的建议,我感谢您的输入!我认为这是一个非常好的建议,可能是我最终实际使用的。我是否仍然需要使用“.Include”才能访问美国企业。BusinessName?否。投影时完全不需要Include。非常好的建议,我感谢您的输入!我认为这是一个非常好的建议,可能是我最终实际使用的。我是否仍需要使用“.Include”才能访问u.Business.BusinessNa