3

我有一个观点,我将只读取(不写入)。此视图没有任何唯一键(不是事件组合)。

那么如何在不接触视图的情况下在 NHibernate 中映射这个视图呢?我不想在视图中添加新列来为我生成唯一标识。有没有办法映射这个视图并在 NHibernate 端生成标识列?

我可以在我的实体类中生成一个 GUID,例如:

public class MyViewClass
{
    private Guid _id = new Guid();
    public virtual Guid Id { get { return _id; } set { _id = value; } }
}

但是我怎样才能使映射工作?以下代码不起作用:

public class MyViewClass: ClassMapping<MyViewClass>
{
    public MyViewClass()
    {
        Mutable(false);
        Id(x => x.Id, m => m.Generator(Generators.Guid));
    }

} 

它希望看到 Id 列并抛出:

System.Data.SqlClient.SqlException: Invalid column name 'Id'.

顺便说一句,我正在使用 NHibernate 3.2 并通过代码进行映射。

4

1 回答 1

1

更新:要在 LINQ 中使用它,将所有列映射为CompositeId和 Mutable(false),然后使用默认实现覆盖 Equals 和 GetHashCode。

public class MyViewClass
{
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}

原答案:

如果您不想插入/更新它,我根本不会映射它

public class MyViewClass
{
    public virtual string Prop1 { get; set; }
    public virtual int Prop2 { get; set; }
}

var viewObjects = session.CreateSQLQuery("SELECT col1 as Prop1, col2 as Prop2 FROM MyView")
    .SetResultTransformer(Transformers.AliasToBean<MyViewClass>())
    .List<MyViewClass>();
于 2011-12-20T17:02:27.917 回答