表用外键

时间:2011-03-21 20:06:40

标签: asp.net-mvc-3 fluent-nhibernate linq-to-nhibernate

如何构建包含“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进行查询吗?

韩国社交协会

3 个答案:

答案 0 :(得分:1)

您使用的是什么类型的ORM?你提到“存储库”,但这是否意味着LinqToSql,实体框架,NHibernate或其他?

看起来您收到错误,因为User字段未作为原始查询的一部分加载。通过从Orders的原始查询中排除相关字段,可以缩小结果集的大小。

有几种方法可以解决这个问题:

  1. 设置存储库(或上下文,具体取决于ORM)以在结果集中包含User属性。
  2. 在访问之前显式加载User属性。请注意,这将是数据库的额外往返,不应该循环完成。
  3. 如果您知道需要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”时有什么作用?