【问题标题】:Fluent NHibernate fetching view without unique identifier流畅的 NHibernate 获取没有唯一标识符的视图
【发布时间】:2010-05-27 10:44:45
【问题描述】:

我正在尝试映射没有标识符的视图,但 nhibernate 仍然会生成带有 id 列的 sql(给我一个 sql 错误,因为 db 中不存在 ID 列)。也许我误解了 Id() 构造函数?

构造函数 cmets:

创建一个在域对象中没有对应属性的Id, 或数据库中的列。这主要用于只读访问 和/或意见。默认为带有“增量”生成器的 int 标识。

public class PersonMapping : ClassMap<Person>
{
    public PersonMapping()
    {
        Table("person");
        ReadOnly();

        Id();
        Map(f => f.Name, "name");
    }
}

【问题讨论】:

    标签: nhibernate fluent


    【解决方案1】:

    NHibernate 需要一个 ID。方法文档说它创建了一个在您的域对象中没有相应属性的 ID - 但是数据库仍然有一个 ID。

    如果您的表中没有字段可标记为标识符(必须是唯一的..),也许您可​​以尝试识别一些可以组合为复合 id 的列。

    例如,给定一个简单的链接表,它将一些 int 链接到另一个 int,例如

    A | B
    -----
    1 | 2
    1 | 3
    2 | 2
    

    只要所有 A/B 组合都是唯一的,您就可以使用复合 ID。

    public PersonMapping()
    {
        [...]
         CompositeId()
             .KeyProperty(x => x.A)
             .KeyProperty(x => x.B);
        [...]
    }
    

    【讨论】:

    • 有没有办法完全忽略数据库字段。像 Id(Guid.NewGuid) 还是这样的?
    【解决方案2】:

    您可以将记录检索为值对象(非托管实体)而不是实体。

    "14.1.5. 返回非托管实体

    可以将IResultTransformer 应用于本机 sql 查询。允许它例如返回非托管实体。

    sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
        .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))
    

    此查询指定:

    • SQL 查询字符串
    • 结果转换器

    上述查询将返回一个CatDTO 的列表,该列表已被实例化,并将NAMEBIRTHNAME 的值注入到其对应的属性或字段中。 "

    【讨论】:

      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多