我正在尝试加入一个表来检索并在POCO上设置属性。这是场景......
*注意 - 应用程序可以属于许多用户会话。
UserSessionId PK
ApplicationId FK
UserName
ApplicationId PK
Name
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)?
答案 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 ...
)创建新结构。另请查看命名查询。