流利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