Asp.net mvc 3 带有外键的表

Asp.net mvc 3 带有外键的表,asp.net-mvc-3,fluent-nhibernate,linq-to-nhibernate,Asp.net Mvc 3,Fluent Nhibernate,Linq To Nhibernate,如何建立包含IdOrder、Description和User的订单表?。。。User字段是对表Users的引用,该表具有IdUser和Name。我正在使用存储库 我有一个存储库: Repository<Orders> ordersRepo = new OrderRepo<Orders>(unitOfWork.Session); 但这将导致如下结果: IdOrder:1-描述:SomeTest-用户:UserProxy123ih12i3123ih12i3uh123 - 当

如何建立包含IdOrder、Description和User的订单表?。。。User字段是对表Users的引用,该表具有IdUser和Name。我正在使用存储库

我有一个存储库:

Repository<Orders> ordersRepo = new OrderRepo<Orders>(unitOfWork.Session);
但这将导致如下结果:

IdOrder:1-描述:SomeTest-用户:UserProxy123ih12i3123ih12i3uh123

-

当预期结果为:

IdOrder:1-描述:SomeTest-用户:Thiago

PS:我不知道为什么它会返回这个用户Proxy123IH12I3123IH12I3UH123。在Db中有一个有效值

观点:

它显示在模型中的foreach var项中

我要怎么做才能把这个名字列入名单?我可以使用LINQ-NHibernate进行查询吗


Tks.

在asp.net MVC中,外键的工作方式与您使用它的方式不同。我相信您必须将用户设置为如下变量:

User user = @item.User;
或者,有时您必须加载引用。我不知道为什么会这样,但根据我的经验,如果我在使用外键执行某项操作之前放置这一行,它就会工作

@item.UserReference.load();

您正在使用什么类型的ORM?您提到了存储库,但这是指LinqToSql、实体框架、NHibernate还是其他

由于用户字段未作为原始查询的一部分加载,因此您似乎遇到了错误。这样做可能会通过从订单的原始查询中排除相关字段来减少结果集的大小

有几个选项可以解决此问题:

根据ORM设置存储库或上下文,以在结果集中包含用户属性。 在访问用户属性之前显式加载该属性。请注意,这将是数据库的额外往返,不应在循环中完成。 在您知道需要用户信息的情况下,确保从原始查询返回此数据是有意义的。如果您使用的是LinqToSql,请查看该类型。可以使用此类型指定要通过查询检索的关系:

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

无论返回的订单数量如何,这只会导致两次数据库跳闸。有关这方面的更多信息,请参见。

当您访问item.User.Name时,会话可能已关闭,因此NHib无法从数据库加载相应的用户。 您可以创建一些模型,并在控制器上使用适当的值对其进行初始化。还可以在映射中禁用Orders.User的延迟加载


但也许这是另一个问题。当从视图访问@item.User.Name时,您有什么结果?

当您有@item.User.Name时,您有什么结果?
var options = new DataLoadOptions();
options.LoadWith<Orders>(o => o.User);

DataContext context = ...;
context.LoadOptions = options;

var query = from o in context.Orders
            select o;
using (ISession session = SessionFactory.OpenSession())
{
    var orders = session.Get<Order>(someId);
    NHibernateUtil.Initialize(orders.User);
}