Asp.net mvc 实体框架-如何处理表关系?
我使用repository模式和LINQtoSQL开发了一个相当小的asp.NETMVC应用程序。我现在想使用实体框架访问和更新相同的数据,但是我很难理解我的语法对于实体框架中的表关系是否正确 假设我正在为一个用户检索一行数据,并且我还希望检索该用户的关联业务(用户表中的外键)。现在我正在做这样的事情: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
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();
}
不幸的是,您无法以一种简单的方式预加载任何更深的引用,在这种情况下,您需要一路循环并加载。我会这样做:
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返回您不需要的日期,例如您不希望在视图中显示的用户或业务的属性
- 视图现在与实体模型解耦。它们都可以独立进化