2011-12-19 11 views
3

私は読んでいるだけの(書き込みなし)という見解を持っています。このビューには、イベントコンポジットではなく一意のキーはありません。NHibernateでID列のないビューをマップする方法は?

これで、ビューに触れることなくNHibernateでこのビューをどのようにマップできますか?私は私に一意のアイデンティティを生成するためにビューに新しい列を追加したくありません。このビューをマップし、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とマッピングを使用しています。

+0

を更新/挿入したいいけない場合、私はまったくそれをマップwouldntの'GetHashCode'と' Equals'をオーバーライドして、基本実装を提供するだけですか? – lbergnehr

+0

私は弾丸を噛んで、 'newid()をIdとして追加する列を私のビューに追加します。 – Rippo

+0

@seldon:複合キーは何からですか?データベース列?私がユニークなキーとして使用できるデータベース列からの実際の合成キーはありません。また、複合キーのMyViewClassで定義したプロパティIDを使用することはできません。これは、データベース内のこの列を探しています(存在しません)。だからあなたの解決策について少し詳しく教えてもらえますか? tnx:> – kaptan

答えて

1

更新:デフォルトの実装と等しく、GetHashCodeメソッドをオーバーライドしCompositeIdと変更可能な(偽)として、すべての列をマップLINQでそれを使用します。

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>(); 
+0

しかし、私はHibernateにLINQを使用したいと思います。だから私はマッピングを作成する必要があると思います。 – kaptan

+0

はい。これはうまくいくだろうが、私はそれを行うよりスマートな方法を探していた。また、return base.Equals(obj)のようなEqualsメソッドを実装したいとは思っていません。あなたの基地がEqualsを適切に実装していることが分かっている場合を除きます。 – kaptan

+0

@kaptan私はちょうどあなたの質問に答えていました、すべての列が一意のキーを形成しないと仮定しています。それらが一意の場合は、EqualsとGetHashCodeを適切に実装します。質問:よりスマートな方法ではどういう意味ですか?結果をよりスマートに返すSQLクエリを作成できますか? – Firo