Свободное автоматическое отображение NHibernate, должно сэкономить время, но это заставляет меня вырывать волосы - PullRequest
1 голос
/ 14 сентября 2009

Я новичок в NHibernate и FNH. Я знаком с ORM и решил посмотреть, о чем идет речь в этом конкретном случае, главным образом из-за повышения производительности. На данный момент я думаю, что мое время было бы лучше потратить на что-то другое, но я не хочу, чтобы это победило меня, и я надеюсь, что это глупая ошибка, которую я совершаю, потому что я очень хочу, чтобы это произвело на меня впечатление. Во всяком случае, я попытался вручную сопоставить сущности (Свободно) безрезультатно, и теперь пытаюсь использовать функцию автоматического выбора. Вот моя модель домена.

public class Book
{
 public virtual int Id { get; protected set; }
 public virtual string Isbn { get; set; }
 public virtual string Title { get; set; }
 public virtual string Author { get; set; }
 public virtual string Publisher { get; set; }
 public virtual User Seller { get; set; }
 public virtual ICollection<string> Pics {get; private set;}
 public virtual string Condition { get; set; }
 public virtual decimal Price { get; set; }
 public virtual ExchangeMethod PreferedExchangeMethod { get; set; }
}
public class Course
{
 public virtual int Id { get; protected set; }
 public virtual University University { get; set; }
 public virtual Semester Semester { get; set; }
 public virtual string Description { get; set; }
 public virtual string Name { get; set; }
 public virtual ICollection<Book> RequiredBooks { get; private set; }
}
public class Exchange
{
 public virtual int Id { get; protected set; }
 public virtual User Buyer { get; set; }
        public virtual User Seller { get; set; }
        public virtual Book Book { get; set; }
        public virtual ExchangeMethod Method { get; set; }
        public virtual decimal Price { get; set; }
        public virtual int SellerFeedbackRating { get; set; }
        public virtual int BuyerFeedbackRating{get; set;}
        public virtual string SellerComment { get; set; }
        public virtual string BuyerComment { get; set; }
}
public class Semester
{
        public virtual int id { get; protected set; }
        public virtual University University { get; set; }
        public virtual int Year { get; set; }
        public virtual string Term { get; set; }
}
public class University
{
        public virtual string Name { get; set; }
        public virtual int Connections { get; set; }
        public virtual ICollection<Course> Courses { get; private set; }
}
public class User
{
        public virtual string UserName { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string Email { get; set; }
        public virtual ICollection<Course> Enrollment { get; private set; }
        public virtual ICollection<Book> Library { get; private set; }
        public virtual ICollection<Exchange> Exchanges { get; private set; }
}

А вот мое отображение

public static ISessionFactory CreateSessionFactory()
{
 IPersistenceConfigurer persistenceConfigurer = SQLiteConfiguration.Standard.UsingFile(DbFile);
        return Fluently.Configure()
                .Database(persistenceConfigurer)
                .Mappings(m => m.AutoMappings.Add(
                    AutoMap.AssemblyOf<User>(assem => assem.Namespace == "DataTransferObjects")
                        .Override<User>(map => map.Id(user => user.UserName))
                        .Override<University>(map => map.Id(univ => univ.Name))
                    ))
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory();
}
private static void BuildSchema(Configuration config)
{
 // delete the existing db on each run
        if (File.Exists(DbFile))
           File.Delete(DbFile);
        // this NHibernate tool takes a configuration (with mapping info in)
        // and exports a database schema from it
        new SchemaExport(config).Create(false, true);
}

Это ошибка, которую я продолжаю получать, которая довольно расплывчата:
Ошибка проверки XML: элемент 'class' в пространстве имен 'urn: nhibernate-mapping-2.2' имеет недопустимый дочерний элемент 'property' в пространстве имен 'urn: nhibernate-mapping-2.2'. Список возможных ожидаемых элементов: 'meta, subselect, cache, синхронизации, комментарий, tuplizer, id, составной-id' в пространстве имен 'urn: nhibernate-mapping-2.2'

Спасибо за любую помощь и извините за длинный пост.

EDIT Оставляет ли способ, которым я выложил свою модель, склонность к ошибкам с круговой логикой, например, У пользователя есть книга, а у книги есть пользователь? Я ожидаю, что автопробег сможет это уловить.

Ответы [ 2 ]

3 голосов
/ 14 сентября 2009

Ну, как мне показалось, это глупая ошибка. Для субъекта семестра у меня было «id» вместо «Id». Я был бы не согласен с тем, что FNH чувствителен к регистру при выполнении автоматического сопоставления, иначе я бы подумал, что с поддержкой «строгой типизации» они предотвращают опечатки в файлах конфигурации.

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

3 голосов
/ 14 сентября 2009

Используете ли вы последнюю версию FNH и NHibernate 2.1 RTM?

Я не уверен в ваших переопределениях кода Id. Вы пробовали без этого и с идентификатором в каждой таблице?

Вот как я делаю свои сопоставления с Automap. Я сообщаю ему, из какой сборки извлечь, из какого конкретно пространства имен, а затем даю ему базовые типы, из которых происходят мои сущности. Я использую ConventionDiscovery, чтобы изменить некоторые соглашения об именах внешних ключей и установить каскадные и обратные свойства и т. Д.

PersistenceModel = AutoPersistenceModel
        .MapEntitiesFromAssemblyOf<>()
        .Where(type => type.Namespace != null && type.Namespace.Contains("Model"))
        .WithSetup(s =>
                     {
                       s.IsBaseType = type => type ==  typeof (DateTimeBase)
                                              || type == typeof (SimpleBase);
                     })
        .ConventionDiscovery.AddFromAssemblyOf();
Затем я добавляю модель постоянства к autoppings. Я использую метод ExportTo для получения копии сгенерированных XML-файлов - просмотр XML-кода помогает диагностировать некоторые проблемы.

.Mappings(m => m.AutoMappings
                         .Add(persistenceModel)
                         .ExportTo(@"../../ExportAutoMaps"));

AutoMapping отлично сработал для меня - хотя для изучения и экспериментов потребовалось время.
Я использую базу данных Jet, и мне нужно явно создать файл базы данных для NHibernate, чтобы запустить схему. Я не знаю, как работает sqlLite.

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