流利NHibernate加入属性值

我试图加入一张表来检索并设置一个POCO的财产。 这是场景......

*注 - 应用程序可以属于许多用户会话。

UserSession(表)

UserSessionId PK
ApplicationId FK
UserName

应用(表)

ApplicationId PK
Name

UserSession(Poco)

string UserName get;
string ApplicationName get;

我尝试过这样的连接:

Join("Application", j => j.Inverse().KeyColumn("ApplicationId").Map(x => x.ApplicationName));

但是,这将使用UserSessionTable的主列作为连接列。 查询的部分如下所示:

/**SNIP**/
inner join
 Auditing.UserSession US
     on this_.UserSessionId=US.UserSessionId
left outer join
 Auditing.Application A
     on US.UserSessionId=A.ApplicationId
/**SNIP**/

如何可以流利地配置nhibernate以使用左表(UserSession)中的正确连接列?


如果你设法映射这个UserSession类,它会产生副作用。 考虑这个代码:

// assume that both user sessions share the same Application.
UserSession userSession1 = session.Get<UserSession>(1);
UserSession userSession2 = session.Get<UserSession>(2);

// what should happen here?
userSession1.ApplicationName = "Blah";

您可能不想更改代码中的应用程序名称。 但是,ORM需要始终在两个方向上同步数据才有意义。

您可以通过实际将它映射到数据库中来解决问题,比如通过将应用程序变成一个真正的实体。

class UserSession
{
  Application Application { get; private set; }
}

如果这种结构对于您的案例来说太复杂了,那么可以考虑编写一个查询来根据需要返回数据:

select session.Name, application.Name
from UserSession session join Application

你也可以从查询中创建一个新的结构( select new ... )。 也看看命名的查询。


不幸的是,我不认为你可以指定这一列。 我相信这是一个极端的限制(不是FluentNH)。 有解决这个问题的办法。 这是一个具有相同类型问题的文章:

连贯的NHibernate在映射中不使用主键连接表

编辑:
使用下面的新实体的示例:

引用(x => x.Application,“ApplicationId”)

这使您可以指定要加入到应用程序表的列。

链接地址: http://www.djcxy.com/p/60987.html

上一篇: Fluent NHibernate join for property value

下一篇: why does it use join when querying foreign key field?