2016-12-02 18 views
1

У меня есть простой объект Карта Guid в колонку в Fluent NHibernate с ограничениями

public class SiteEntity 
{ 
    public virtual int Id {get; set;} 
    public virtual Guid PublicId {get; set;} 
    public virtual string Name {get; set;} 
} 

Я отображающий его с помощью Fluent NHibernate пакета для достижения следующих ограничений:

  • Id является идентификатором внутренней БД так он создается автоматически и определяется как PK
  • PublicId является публичным уникальным идентификатором. Она определяется как столбец с уникальным и не нулевым ограничением и генерируется при вставке так же, как ПК
  • Name это описание, так что требуется (не нуль), но может быть что-нибудь

В результате я следующее отображение

public class SiteEntityMap : ClassMap<SiteEntity> 
{ 
    public SiteEntityMap() 
    { 
     Table("T_SITE"); 
     Id(x => x.Id).Column("site_id").GeneratedBy.Identity(); 
     Map(x => x.PublicId, "site_public_id").Generated.Insert().ReadOnly().Unique().Not.Nullable(); 
     Map(x => x.Name, "site_name").Not.Nullable().CustomType("AnsiString").Unique().Length(512); 
     ReadOnly(); 
    } 
} 

Теперь, если я создаю схемы с использованием NHibernate сопоставления ее создания, как мне нравится. Тем не менее, попытка сохранить SiteEntity поле, которое Name инициализированному результаты в GenericADOException с сообщением:

«не смог вставить: [IWS.Configuration.DataModel.SiteEntity] [SQL: INSERT INTO T_CFG_SITE (site_name) VALUES (?), выберите SCOPE_IDENTITY()]»

Если удалить Not.Nullable() из картографирования PublicId собственности все работает, но поле в БД позволяет NULLs.

Просьба сообщить, как я могу сопоставить свойство Guid с столбцом с нулевым значением с автогенерируемым значением вставки.

+0

Вы проверили, как сущность строится непосредственно перед вставкой? –

+0

Кажется, что имя_сайта равно null, вы его проверили? Вы проверяли, есть ли какой-то триггер? Взгляните на эту таблицу: T_CFG_SITE –

+0

Да, когда я вызываю 'session.Save (siteEntity)' объект имеет значение в свойстве Name. Я писал в вопросе, что, хотя сообщение и есть то, что ему нравится, актуальная проблема заключается в отображении свойства PublicId. Пожалуйста, перечитайте вопрос и сообщите мне, что неясно, поэтому я могу перефразировать. –

ответ

1

Похоже, что Fluent NHibernate не имеет возможности диктовать неявную генерирующую логику для такого рода значений. Можно определить значение по умолчанию, но использование конкретных функций БД нарушает абстракцию БД. К сожалению, свойство Generated не раскрывает способ ввода кода, который генерирует значение для операции Insert() (или для Update()). Короткий ответ: «нет возможности принудительно генерировать значение неявно или объявлять код, который делает это во время отображения».

 Смежные вопросы

  • Нет связанных вопросов^_^