4

私は次のエンティティがありますNHibernateは読み取り専用プロパティ - 流暢マッピング

public class Topic : EntityBase 
{ 
    private readonly ICollection<Vote> _votes; 

    public virtual string Title { get; protected set; } 
    public virtual ICollection<Vote> Votes 
    { 
     get { return _votes; } 
    } 

    public virtual int VotedUpCount 
    { 
     get 
     { 
      return _votes.Count(v => v.VotedTo == VoteType.VoteUp); 
     } 
    } 
} 

を私は私のVotedUpCount(私はNHからのエラーを持っているので)をマッピングする必要があります。 BUT私はこのプロパティをデータベースの列として必要としません。

私はこのエンティティが動作するために流れるようなインターフェイスを使用して読み取り専用のプロパティをマップする方法はあり、このいずれかを試してみましたInvalid column name 'VotedUpCount'.

public class TopicMap : ClassMap<Topic> 
{ 
    public TopicMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Title); 
     Map(x => x.VotedUpCount).Access.ReadOnly(); 
     HasMany<Vote>(x => x.Votes) 
      .Cascade.All(); 
    } 
} 

エラーが発生しましたか?

+0

をあなたのの文言に基づいて*あなたの状況のた​​めに働くべきではない答えを受け入れ質問*。回答に合わせて質問を編集するか、回答を受け入れないでください。 –

答えて

7

なぜマップしたいですか?それはちょうどメソッドであるかもしれないいくつかのコードを実行する.NETのプロパティであり、データベースとは何も関係がなく、全くマッピングしません。

あなたが読み取り専用としてマップされた実際のDBのプロパティ(値がDB列どこから来るのか)が必要な場合:

Map(x => x.PropertyName).Column("ColumnName").ReadOnly(); 
// Alternative (does exactly the same, but is more like the NHibernate mapping: 
Map(x => x.PropertyName).Column("ColumnName").Not.Insert().Not.Update(); 
+0

たとえば、私は定義済みのデータを持っており、それをDBにロードしました。私はデータを不変にしたいのですが、どうすればいいのですか? – Anton

+0

@Antonあなたの質問では、あなたはDBのプロパティを持っていないと言った。とにかく、私は読み取り専用のDBプロパティマッピングを含むように私の答えを更新しました。 – cremor

+2

2つのバージョンのテスト:.ReadOnly();と.Not.Insert()。NotUpdate(); 私はそれらが「まったく同じ」ではなく、実際には異なる結果(おそらく流暢なバグ)があると判断しました。 .Not.Insert()。NotUpdate();同じ列にマップされた2番目のフィールドでは使用できません。これは、更新時にsql句に列が2回リストされるためです。 –

関連する問題