Укажите автоматическое сопоставление Fluent NHibernate, чтобы добавить уникальное ограничение ко всем сущностям - PullRequest
2 голосов
/ 30 ноября 2009

Мой автопоиск:

 return Fluently.Configure()
                .Database(config)
                .Mappings(m =>
                          m.AutoMappings.Add(
                              AutoMap.AssemblyOf<Company>()
                                  .Where(
                                  t => t.Namespace == "DAL.DomainModel" && t.IsClass)
                                  .IgnoreBase<ReferenceEntity>()))
                .BuildSessionFactory();

Итак, ReferenceEntity - это абстрактный класс, содержащий строковое имя, и все мои ссылочные объекты наследуются от этого класса. Я хотел бы изменить свое автоматическое отображение, добавив уникальное ограничение в поле «Имя» для всех объектов, которые наследуются от ReferenceEntity.

Я понял, что это как-то связано с настройкой, но я немного растерялся.

примечание: Я использую RTM Fluent NHibernate v1.0, поэтому соглашения будут соответствовать новому стилю, если это соответствует моей цели.

1 Ответ

2 голосов
/ 15 января 2010

Если все ваши объекты наследуются от ReferenceEntity, не хотите ли вы создать уникальное ограничение для свойства Name для всех отображаемых объектов?

Но если вы хотите фильтровать по базовому классу сущности, вы можете это сделать. Используйте соглашение для добавления уникального ограничения в ваши отображения:

public class NameConvention : IPropertyConvention
{
    public void Apply(IPropertyInstance instance)
    {
        // Check the entity base class type
        if (instance.EntityType.BaseType.Name == "ReferenceEntity")
        {
            // Only add constraint to the .Name property
            if (instance.Name == "Name")
            {
                instance.Unique();
            }
        }
    }
}

Чтобы получить соглашение (и все другие соглашения в сборке), выбранные FNH, просто добавьте в эту строку настройку AutoMap, указанную выше:

.Conventions.AddFromAssemblyOf<NameConvention>()

Алекс,

Нет, ответ не меняется. Вот пример, использующий соглашение выше.

public abstract class ReferenceEntity
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
}

public class User : ReferenceEntity
{
    public virtual string Email { get; set; }
}

public class Item : ReferenceEntity
{
    public virtual string Description { get; set; }
}

Это создает sql:

create table Users (
    Id INTEGER not null,
   Email TEXT not null,
   Name TEXT not null unique,
   primary key (Id)
)

create table Items (
    Id INTEGER not null,
   Description TEXT,
   Name TEXT not null unique,
   primary key (Id)
)

Пока это отдельные сущности, это создаст уникальное ограничение для свойства .Name для каждой сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...