如何构建包含“IdOrder”,“Description”和“User”的“订单”表?...“用户”字段是对“用户”表的引用,该表具有“IdUser”和“名称”。我正在使用存储库。
我有这个存储库:
Repository<Orders> ordersRepo = new OrderRepo<Orders>(unitOfWork.Session);
将所有订单返回到View,我只是这样做:
return View(ordersRepo.All());
但这会导致类似:
IdOrder :1 - 说明:SomeTest - 用户:UserProxy123ih12i3123ih12i3uh123
-
当预期结果是:
IdOrder :1 - 说明:SomeTest - 用户:Thiago。
PS:我不知道为什么它会返回“UserProxy123ih12i3123ih12i3uh123”。在Db中有一个有效值。
观点:
显示在foreach (var item in Model)
。
@item.Description
@item.User //--> If it is @item.User.Name doesn't work.
我要把名字放在这个名单上怎么办?我可以使用LINQ - NHibernate进行查询吗?
韩国社交协会
答案 0 :(得分:1)
您使用的是什么类型的ORM?你提到“存储库”,但这是否意味着LinqToSql,实体框架,NHibernate或其他?
看起来您收到错误,因为User
字段未作为原始查询的一部分加载。通过从Orders
的原始查询中排除相关字段,可以缩小结果集的大小。
有几种方法可以解决这个问题:
User
属性。 User
属性。请注意,这将是数据库的额外往返,不应该循环完成。如果您知道需要User
信息,则确保从原始查询返回此数据是有意义的。如果您使用的是LinqToSql,请查看DataLoadOptions类型。您可以使用此类型指定要使用查询检索的关系:
var options = new DataLoadOptions();
options.LoadWith<Orders>(o => o.User);
DataContext context = ...;
context.LoadOptions = options;
var query = from o in context.Orders
select o;
无论你使用什么样的ORM,都应该采用类似的方法来实现同样的目标。
在NHibernate中,您可以执行以下操作:
using (ISession session = SessionFactory.OpenSession())
{
var orders = session.Get<Order>(someId);
NHibernateUtil.Initialize(orders.User);
}
这将导致只有两次数据库跳转(无论返回的订单数量是多少)。有关这方面的更多信息,请参见here。
答案 1 :(得分:0)
在asp.net MVC中,外键不能像你使用它一样工作。我相信你必须将用户设置为这样的变量:
User user = @item.User;
或者你有时需要加载引用。我不知道为什么会这样,但根据我的经验,如果我在使用外键进行操作之前将其放在行之前
@item.UserReference.load();
答案 2 :(得分:0)
当您访问item.User.Name时,会话已经关闭,因此NHib无法从数据库加载适当的用户。 您可以创建一些模型并在控制器上使用适当的值对其进行初始化。您还可以在映射中禁用Orders.User的延迟加载。
但也许这是另一个问题。从View中访问“@ item.User.Name”时有什么作用?