Определение уникального столбца в Fluent NHibernate Automap Override - PullRequest
1 голос
/ 08 ноября 2011

Я пытаюсь указать уникальный столбец для сущности, используя переопределение Fluent NHibernate Automapper. Для моего тестового класса CodeType я бы хотел сделать свойство Type уникальным. Цель состоит в том, чтобы «новый CodeType ()» создавался с тем же типом поля, что и текущий сохраненный CodeType, для наложения поверх текущего объекта.

У меня есть следующий класс CodeType:

public class CodeType : SecurableEntity
{

    public virtual string Type { get; set; }
    public virtual string Description { get; set; }

    /// <summary>
    /// This is a placeholder constructor for NHibernate.
    /// A no-argument constructor must be available for NHibernate to create the object.
    /// </summary>
    public CodeType() { }


}

У меня есть следующий класс CodeTypeMap:

public class CodeTypeMap : IAutoMappingOverride<CodeType>
{
    public void Override(AutoMapping<CodeType> mapping)
    {
        //Doesn't work. Need a way to specify a column as unique.
        mapping.Map(m => m.Type).Unique();
    }
}

Переопределение применяется к AutoMap с помощью следующего:

    public AutoPersistenceModel Generate()
    {
        var mappings = AutoMap.AssemblyOf<User>(new AutomappingConfiguration());
        mappings.IgnoreBase<Entity>();
        mappings.IgnoreBase<SecurableEntity>();
        mappings.IgnoreBase(typeof(EntityWithTypedId<>));
        mappings.Conventions.Setup(GetConventions());
        mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
        mappings.UseOverridesFromAssemblyOf<UserMap>();
        mappings.UseOverridesFromAssemblyOf<CodeMap>();
        mappings.UseOverridesFromAssemblyOf<CodeTypeMap>();

        return mappings;
    }

Мне бы хотелось, чтобы следующий код обновлял любую существующую запись с «типом», равным «существующему типу».

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>();
CodeType ct = new CodeType();
ct.type = "existingType";
ct = ctr.SaveOrUpdate(ct);

Как сделать ключ NHibernate из поля типа уникальным?

Возможно ли это?

1 Ответ

0 голосов
/ 08 ноября 2011

краткий ответ, то, что вы хотите - это то, что вы должны обрабатывать в коде, потому что существует так много возможностей. Каждый раз, когда вы создаете новый CodeType, вы должны проверять БД, если он уже есть

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>();
CodeType ct = ctr.GetByType("existingType");
if (ct == null)
{
    ct = new CodeType { type = "existingType" };
}
ctr.SaveOrUpdate(ct);

или

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>();
CodeType ct = ctr.GetByType("existingType");
if (ct != null)
{
    ctr.Detach(ct);
    ctr.Merge(new CodeType{ type = "existingType" });
}

или

SecurableEntityRepository<CodeType> ctr = new SecurableEntityRepository<CodeType>();
int ctId = ctr.GetIdByType("existingType");
if (ct != 0)
{
    ctr.Merge(new CodeType{ Id = ctId, type = "existingType" });
}

и есть некоторые вещи, которые можно написать по-другому

  • public CodeType() { } можно удалить или сделать protected CodeType() { }, если он не нужен для вашего домена

  • public AutoPersistenceModel Generate()
    {
        return AutoMap.AssemblyOf<User>(new AutomappingConfiguration())
            .IgnoreBase<Entity>()
            .IgnoreBase<SecurableEntity>()
            .IgnoreBase(typeof(EntityWithTypedId<>))
            .Conventions.Setup(GetConventions())
            .UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>();
    }
    
...