使用NHibernate从数据库视图加载数据

时间:2013-02-18 15:36:24

标签: nhibernate fluent-nhibernate

我正在使用NHibernate并希望将数据库视图中的单个字段加载到我的模型中。情况如下:

我有一个USERS表,其中有一个名为AVATAR_ID的列。在数据库中还定义了一个名为VIEW_RESOURCES的单独视图。该视图包含ID和PATH列。 ID可以与存储在AVATAR_ID列中的值匹配。

在SQL中我会做以下事情:

select U.ID, U.USERNAME, R.PATH
from USERS U
left join VIEW_RESOURCES R on R.ID = U.AVATAR_ID
where U.ID = ...

我在C#代码中定义了模型的属性,如下所示:

public virtual Id { get; protected set; }
public virtual string UserName { get; set; }
public virtual string AvatarPath { get; protected set; }

我正在使用FluentNHibernate进行映射,如下所示:

Table("USERS");
Id(x => x.Id).GeneratedBy.Identity().Column("ID");
Map(x => x.UserName).Column("USERNAME").Not.Nullable().Length(256);

用于加载单个用户的代码如下所示:

User user = session
.QueryOver<User>()
.Where(x => x.Id == id)
.SingleOrDefault();

到目前为止一切顺利,但我需要知道的是:

  • 如何定义AvatarPath的映射?
  • 如何将VIEW_RESOURCES视图的PATH列加载到User对象的AvatarPath属性中?我宁愿不把它作为一个与用户有关系的单独模型加载。我希望它作为User上的属性,如果可能的话。

1 个答案:

答案 0 :(得分:3)

您可以将其映射为公式

Map(x => x.AvatarPath).Formula("(SELECT R.PATH FROM VIEW_RESOURCES R WHERE R.ID = AVATAR_ID)");

除此之外,您可以将模型和引用设为私有,以便它不会出现