Добавьте уникальное ограничение для нескольких ключей для внешнего ключа, используя автоматическое преобразование fluent-nhibernate. - PullRequest
3 голосов
/ 13 января 2010

Я новичок NHibernate и свободно-nhibernate. И у меня есть некоторые проблемы с уникальным ограничением и отображением nhibernate.

У меня есть следующая часть модели домена.

public class Batch
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual IList<BatchParameter> BatchParameters {get; set;}
}
public class BatchParameter
{
    public virtual int Id {get; set;}
    public virtual string Name {get; set;}
    public virtual Batch Batch {get; set;}
}

Я пытаюсь использовать fluent-nhibernate, чтобы отобразить его на БД (SQLServer), используя автоматическое отображение. Я хочу настроить свою БД, чтобы иметь:

  • Первичные ключи в свойствах "Id"

  • внешний ключ в таблице BatchParamets

  • Уникальное ограничение на таблицу партий в столбце Имя

  • Уникальное ограничение в таблице BatchParameters в столбцах Name и Batch_Id

Итак, я записал этот код:

public class BatchMapping : IAutoMappingOverride<Batch>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<Batch> mapping)
    {
        mapping.Id( b => b.Id);
        mapping.HasMany<BatchParameter>(p => p.BatchParameters).Cascade.All().Inverse();
    }
}

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<BatchParameter> mapping)
    {
        mapping.Id( b => b.Id);
        mapping.Map(b => b.Name).Unique();
        //mapping.Map(p => p.Name).UniqueKey("Batch_Parameter");
        //mapping.Map(p => p.Batch.Id).UniqueKey("Batch_Parameter");
    }
}

Нет проблем для первичных ключей, внешнего ключа и первого уникального ограничения. Немного головной боли за Уникальное ограничение.

Может кто-нибудь показать мне прямой путь?

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 мая 2011

Во-первых, похоже, что у вас ошибка копирования и вставки: ...Map(b => b.Name)... должно идти в BatchMapping, а не BatchParameterMapping.

public class BatchMapping : IAutoMappingOverride<Batch>
{
    public void Override(AutoMapping<Batch> mapping)
    {
        mapping.Map(b => b.Name).Unique();
    }
}

Далее, BatchParameter.Batch - это отношение многие-к-одному от BatchParameter до Batch, поэтому оно должно отображаться с References(...) вместо Map(...). Вы используете References для внешних ключей другой сущности и Map для простых свойств.

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter>
{
    public void Override(AutoMapping<BatchParameter> mapping)
    {
        mapping.Map(p => p.Name).UniqueKey("Batch_Parameter");
        mapping.References(p => p.Batch).UniqueKey("Batch_Parameter");
    }
}

Наконец, вы должны удалить ненужные сопоставления для свойств Id и Batch.BatchParameters. Автоматическое сопоставление Fluent NHibernate по умолчанию отобразит их как требуется. В ваших Override методах вам нужно только указать свойства, для которых вы хотите сделать что-то отличное от автоматического сопоставления по умолчанию, например, указать уникальные ключи.

0 голосов
/ 29 марта 2011

Если Id и Name являются первичными ключами в вашей таблице BatchParameter, вам потребуется составной идентификатор. Также, если вы хотите получить ссылку на Batch из вашего класса BatchParameter, вам нужно будет использовать Reference. Следующее должно быть близко к тому, что вам нужно:

public class BatchParameterMapping : IAutoMappingOverride<BatchParameter>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<BatchParameter> mapping)
    {
        mapping.CompositeId()
            .KeyProperty(x => x.Id)
            .KeyProperty(x => x.Name);

        mapping.References(x => x.Batch);
    }
}
...