Быстрые NHibernate осуществляют Не Nullable на Ссылке Внешнего ключа

Просто намочить ноги с некоторыми Быстрыми конвенциями NHibernate AutoMap, и столкнулось с чем-то, что я не мог выяснить. Я предполагаю, что просто не смотрю в правильном месте... В основном попытка осуществить NOT NULL на "многих" примыкает связи "один ко многим". Это кажется, с помощью автоотображения, это всегда делает родительское свойство Id nullable в базе данных.

Я сделал некоторый поиск на StackOverFlow и нашел подобные вопросы, но ничто касающееся AutoMapping и Конвенции, хотя (если я не пропустил его).

Быстрый пример...

public class Group    // One Group
{
    public Group() { this.Jobs = new List(); }
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList Jobs { get; protected set; }
}

public class Job    // Has many Jobs
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    // Trying to make this field not-nullable in the database.
    public virtual Group Group { get; set; }
}

Я думал, что смогу просто создать конвенцию как...

public class OneToManyConvention : IHasOneConvention
{
    public void Apply(IOneToOneInstance instance)
    {
        // Nullable() isn't a valid method...
        instance.Not.Nullable();   
    }
}

Но кажется, что IOneToOnInstance не имеет Nullable () методом. Я могу сделать это, если я создаю файл Карты для Job, но старающийся избегать каких-либо файлов Карты и придерживаюсь автоотображения.

Я столкнулся с этой ссылкой на Быстрый список группы, описывающий что-то подобное.

Который описывает что-то вроде этого...

public class NotNullPropertyConvention : IPropertyConvention
{
    public bool Accept(IProperty target)
    {
            return true;
    }
    public void Apply(IProperty target)
    {
            target.Not.Nullable();
    }
}

Но это поднимает вопросы... 1), Как я определил бы IProperty, чтобы быть Заданием (или дочернее свойство, которое является ссылкой назад на родителя),

2) Это сделало упоминание на той странице, что использование этого переопределит мои ручные переопределения, например, если очень определенная ссылка свойства должна была быть ПУСТОЙ. Который был бы проблемой (если это - все еще проблема, но не может протестировать, не выясняя № 1 сначала),

Какие-либо идеи об этом? Я просто пропускаю что-то?



Обновление 1

Тем не менее никакие не идут. Даже следующее все еще не осуществляет Не-Nullable в схеме базы данных...

public class FluentConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        instance.Not.Nullable();
    }
}

Это делает для всех других полей хотя...
/ пожатие плеч

Какие-либо идеи?



Обновление 2

В то время как это не ответ, я искал, я действительно находил работу вокруг... Я использовал блок Блока проверки допустимости NHibernate, и в рамках того блока существует [NotNull] атрибут. Если бы я украсил свой класс атрибутом Блока проверки допустимости и связал ValidationEngine к NHibernate перед созданием схемы, то это отметило бы столбец базы данных FK как Не-Nullable.

public class Job    // Has many Jobs
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }

    [NHibernate.Validator.Constraints.NotNull]
    public virtual Group Group { get; set; }
}

Если кому-либо нужен полный код для NHibernate + инициализация ValidationEngine, просто сообщите мне. Все еще ища способ сделать это с помощью чистой конвенции отображения направляет хотя, если у кого-либо есть какая-либо информация...

Спасибо!

5
задан Steve Foster 30 November 2009 в 23:32
поделиться

1 ответ

Вы можете переопределить свойства автосопоставления как часть вашего AutoMap в Fluenttly.Configure().

Так что вы можете сделать это:

.Override<Job>(map => map.References(x => x.Group).Not.Nullable())

Это не совсем удобно, если у вас много классов, которым это нужно.

Edit: Вы также можете указать переопределение в классе, реализующем IAutoMappingOverride так:

    public class JobMappingOverride : IAutoMappingOverride<Job>
    {
            public void Override(AutoMapping<Job> mapping)
            {
                    mapping.References(x => x.Group).Not.Nullable();
            }
    }

и включить его так:

    .UseOverridesFromAssemblyOf<JobMappingOverride>()

Это сделает вашу конфигурацию немного чище.

8
ответ дан 14 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: