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 (где значение приходит из столбца БД) отображается как неизменяемые:

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

Например, у меня есть предопределенные данные, и я загрузил его в БД. Я хочу сделать данные неизменными, как я могу это сделать? – Anton

+0

@Anton В вашем вопросе вы сказали, что у вас нет свойства в БД. Во всяком случае, я обновил свой ответ, чтобы содержать картографирование свойств только для чтения. – cremor

+2

Тестирование двух версий: .ReadOnly(); и .Not.Insert(). Not.Update(); Я решил, что они не «точно такие же», и на самом деле они имеют разные последствия (возможно, ошибка в бегстве). .Not.Insert() Not.Update(). не может использоваться со вторым полем, сопоставленным с тем же столбцом, потому что при обновлении он перечислит столбец дважды в предложении sql. –