实体框架 - 如何处理表关系?

时间:2009-10-07 10:55:19

标签: asp.net-mvc entity-framework

我使用存储库模式和Linq to Sql开发了一个相当小的asp.net MVC应用程序。我现在想使用实体框架访问和更新相同的数据,但是我无法理解我的语法是否适用于实体框架中的表关系。

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

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;                    
}

我是以正确的方式来做这件事的吗?任何建议将不胜感激。

3 个答案:

答案 0 :(得分:1)

除了因为你在循环中覆盖ViewData [“BusinessName”]而没有真正说出你要做什么的foreach部分,你几乎正在跟踪正在发生的事情。

如果这是让用户说正在显示的用户,并且您还希望显示一些BusinessNames,则它们应该在视图中可用。实体框架的无聊事物以及我选择临时使用其他解决方案的原因是必须加载引用。

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

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

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

答案 1 :(得分:0)

不,这似乎不太合适。这更像是:

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

这假定您的用户实体具有名为Business的导航属性。

答案 2 :(得分:0)

我会这样做:

  1. 为您的视图制作演示模型,并将视图更改为强类型视图。
  2. 使用L2E投影到演示模型上。
  3. 像这样:

    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返回您不需要的日期,例如您不打算在视图中显示的User或Business属性。
    • 您的视图现在已与实体模型分离。它们都可以独立发展。