我使用存储库模式和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;
}
我是以正确的方式来做这件事的吗?任何建议将不胜感激。
答案 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)
我会这样做:
像这样:
var model = (from u in Context.Users
where u.UserId == userId
select new UserPresentation
{
UserName = u.Name,
BusinessName = u.Business.BusinessName,
SomeOtherDatumYourViewNeeds = // ...
}).FirstOrDefault();
这里有一些重点: