Что не так с этой свободно настраиваемой конфигурацией NHibernate? - PullRequest
2 голосов
/ 31 марта 2009

Что не так со следующей настройкой? Фильтр Where в AutoPersistanceModel не работает, и соглашение с именами таблиц также не работает. Ошибка, которую я обычно получаю: «Элемент« класс »в пространстве имен« urn: nhibernate-mapping-2.2 »имеет недопустимый дочерний элемент« свойство »в пространстве имен« urn: nhibernate-mapping-2.2 ». 'meta, jcs-cache, cache, id, составной-идентификатор' в пространстве имен 'urn: nhibernate-mapping-2.2'. " Вот мой код:

    public ISessionFactory BuildSessionFactory()
    {
        return Fluently.Configure()
            .Database(
                OracleConfiguration.Oracle9.ConnectionString(
                c => c.FromConnectionStringWithKey("ConnectionString")))
            .Mappings(m =>
                          {
                              m.AutoMappings.Add(GetAutoPersistanceModel);
                              m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
                          })
            .BuildSessionFactory();
    }

    public AutoPersistenceModel GetAutoPersistanceModel()
    {
        return AutoPersistenceModel.MapEntitiesFromAssemblyOf<User>()
            .Where(type => type.IsClass && !type.IsAbstract && type.Namespace == "Some.Namespace")
            .ConventionDiscovery.Add<IConvention>(
                Table.Is(x => "tbl" + x.EntityType.Name.Pluralize())
            );
    }

Ответы [ 2 ]

6 голосов
/ 31 марта 2009

Исключение говорит о том, что NHibernate сначала обнаружил элемент <property />, который недопустим. Первый элемент в hbm-файле NHibernate должен (почти) всегда быть идентификатором, поэтому, похоже, AutoPersistenceModel не находит ваши идентификаторы.

Как ваши идентификаторы названы в ваших сущностях? AutoPersistenceModel ожидает, что их буквально назовут Id , если они будут отличаться, то они их не найдут.

Вы можете использовать опцию конфигурации FindIdentity, чтобы переопределить способ, которым AutoPersistenceModel находит идентификаторы, что может быть полезно, если вы не можете изменять свои сущности.

// if your Id is EntityId
.WithSetup(s =>
  s.FindIdentity = property => property.DeclaredType.Name + "Id"
)
1 голос
/ 29 апреля 2009

Джеймс ведет вас правильно, но его фрагмент неверен.

.WithSetup(s=> s.FindIdentity = p => p.Name == "ID"));

Это то, что вы ищете! Замените «ID» тем, что когда-либо было вашим фактическим имуществом.

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