3

読み取りのみを行うビューがあります (書き込みはありません)。このビューには一意のキーがありません (イベント コンポジットではありません)。

ビューに触れずにNHibernateでこのビューをマップするにはどうすればよいですか? ビューに新しい列を追加して、一意の ID を生成したくありません。このビューをマップし、NHibernate 側で ID 列を生成する方法はありますか?

次のようなエンティティ クラスで 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 で使用するには、すべての列をCompositeIdMutable(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 に答える