2016-09-26 2 views
0

Я использую NHibernate 4.0.0.4000 (с отображением по коду) и SQL Server 2012.NHibernate чтения временной метки столбца из SQL Server

У меня есть доступ к таблицам, которые (среди прочих) содержат timestamp (в противном случае также известный как rowversion). До сих пор я мог просто игнорировать столбец, не используя его в моем Entity/Mapping.

Теперь я хочу использовать его для просмотра, какие строки изменились с тех пор, как я последний раз проверил таблицу.

Поскольку временная метка может быть заменена только SQL Server, любые операторы INSERT/UPDATE, созданные NHibernate, должны игнорировать этот столбец. Я не нашел решения для этой проблемы.

Моя сущность:

public class TblAnwendungsbelegposition { 
    public virtual int ANWBID { get; set; } 
    // Other properties cut out for readability 
    public virtual byte[] upsize_ts { get; set; } 
} 

Мое отображение:

public class TblAnwendungsbelegpositionMap : ClassMapping<TblAnwendungsbelegposition> { 

    public TblAnwendungsbelegpositionMap() { 
     Table("tbl_anwendungsbelegposition"); 
     Schema("dbo"); 
     Lazy(true); 
     Id(x => x.ANWBID, map => map.Generator(Generators.Identity)); 
     //Other properties cut out for readability 
     Property(x => x.upsize_ts, map => map.Access(Accessor.ReadOnly)); 
    } 
} 

Результат этой версии:

Невозможно обновить столбец временной метки

как е rror во время , читающего (об автоматическом Session.Flush() при закрытии с использованием оператора, обертывающего соединение db).

Когда я извлекаю аксессор в отображении я могу читать без проблем, но когда я вставить новую строку в таблицу, я получаю сообщение

Невозможно вставить явное значение в столбец временной метки. Используйте INSERT со списком столбцов, чтобы исключить столбец timestamp или вставить DEFAULT в столбец timestamp.

Когда я изменить к private set;, я получаю сообщение во время начальной BuildSessionFactory();

Следующие типы не могут быть использованы в качестве прокси-серверов: PigTool.Entities.TblAnwendungsbelegposition: метод set_upsize_ts должен быть " public/protected virtual 'или' protected internal virtual '

Когда я удаляю от объекта-объекта, я получаю сообщение во время i nitial BuildSessionFactory();

Не удалось найти Присваиватель свойства «upsize_ts» в классе «PigTool.Entities.TblAnwendungsbelegposition»

Кто-нибудь есть идея, как я могу успешно читать строки, содержащие этот столбец только для чтения, в то время как сохраняя способность генерировать новые строки? Я бы предпочел не иметь двух сущностей/сопоставлений в соответствующей таблице, где один не содержит свойство timestamp для повседневной работы и тот, который имеет его, но используется только для чтения.

ответ

0

Я, наконец, нашел решение.

В обмен Картирование

 Property(x => x.upsize_ts, map => map.Access(Accessor.ReadOnly)); 

с

 Version(x => x.upsize_ts, map => 
     { 
      map.Column(c => 
      { 
       c.SqlType("timestamp"); 
       c.NotNullable(false); 
      }); 
      map.Type(new BinaryBlobType()); 
      map.Generated(VersionGeneration.Always); 
      map.UnsavedValue(null); 
     }); 
Смежные вопросы