流利的NHibernate加入物业价值

时间:2011-05-17 13:38:11

标签: c# nhibernate fluent-nhibernate nhibernate-mapping

我正在尝试加入一个表来检索并在POCO上设置属性。这是场景......

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

Model relationship

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)?

2 个答案:

答案 0 :(得分:2)

Joe很遗憾我认为你不能指定这个专栏。我相信这是一个nhibernate限制(不是FluentNH)。有解决方法。这是一篇具有相同类型问题的文章:

Fluent NHibernate join tables in mapping not using primary key

修改
使用下面的新实体的示例:

参考文献(x => x.Application,“ApplicationId”)

这允许您指定要加入Application表的列。

答案 1 :(得分:1)

如果您设法映射此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 ...)创建新结构。另请查看命名查询。