Свободный Nhibernate изменить идентификатор по умолчанию - PullRequest
0 голосов
/ 06 августа 2011

Сегодня я настраивал свободный nhibernate. Я столкнулся с идентификаторами, и когда я сопоставил один класс с другим, я должен был указать, к какому идентификатору относится класс. Поскольку мой идентификатор всегда имя класса + идентификатор.

nhibernate имеет имя класса по умолчанию + "_" + id.

поэтому, когда мне нужно создать отображение следующим образом:

Id (x => x.MenuItemId, "MenuItemId");

Как мне перезаписать настройки так, как мне нужно, и поэтому я могу использовать только сопоставление как

Идентификатор (х => x.MenuItemId)

проблема возникает только тогда, когда я присоединяюсь к другим классам, например

Entity Menu присоединяется к MenuItem, и я использую

* * HasMany тысячи двадцать-одина (х => x.MenuItems) .class (TypeOf (меню)) * * тысяча двадцать-дв

1 Ответ

0 голосов
/ 06 августа 2011

нашел это: это решение.

Персон

Автоматизм самоуверен, он ожидает, что ваши классы будут разработаны определенным образом; если это не так, то он не сможет автоматизировать их без небольшой помощи. Автопроизводитель ожидает, что ваши имена будут названы Id, и если они не будут найдены, он их не найдет.

Вы можете изменить способ обнаружения идентичности автоматом, переопределив метод IsId в вашей конфигурации автоматического отображения. Этот метод будет вызываться для всех участников в ваших организациях, которые уже были приняты критериями ShouldMap (Member); любой член, которому вы вернете значение true, будет отображен как личность.

public override bool IsId(Member member)
{
  return member.Name == member.DeclaringType.Name + "Id";
}

Этот пример будет соответствовать любым идентификаторам, которые названы в честь их сущности, например CustomerId.

и назвав его:

return Fluently.Configure()
               .MsSql2008
               .ConnectionString(c => c.FromConnectionStringWithKey("database"))
           .ShowSql()
               .ProxyFactoryFactory("NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu"))
                .Mappings(x => x.FluentMappings
.AddFromAssembly(
Assembly.GetExecutingAssembly())
.Conventions.AddFromAssemblyOf<Location.IdConvention>())
.BuildSessionFactory();

и после настройки идентификатора

public class IdConvention : IIdConvention
    {
        public void Apply(IIdentityInstance identityInstance)
        {
            identityInstance.Column(identityInstance.EntityType.Name + "Id");
        }
    }
...