NHibernate 3.2 картографический выбор, отношения и POV? - PullRequest
2 голосов
/ 25 октября 2011

Я пытаюсь выучить NH (версия 3.2) и у меня проблемы с пониманием некоторых вариантов картографирования. Скотт Финдлэйтер опубликовал свой полностью рабочий скелет для сексуального Loquacious NH здесь , и мои вопросы о картографировании будут основаны на его выборке. Вот модель предметной области (рис. Не является частью его примера, но включена здесь для ясности):

enter image description here

Его класс категории выглядит так:

public class Category : Entity
    {
        public Category()
        {
            Products = new List<Product>();
            SubCategories = new List<Category>();
        }

        public virtual string Name { get; set; }
        public virtual string Description { get; set; }
        public virtual Category Parent { get; set; }
        public virtual IEnumerable<Category> SubCategories { get; set; }
        public virtual IList<Product> Products { get; set; }
    }

и его класс отображения такой:

class CategoryMap : ClassMapping<Category>
    {
        public CategoryMap()
        {
            // **************************************************
            // Mapping of Id here will take precedence over the 
            // global conventions configured in the ModelMapper.
            // **************************************************
            //Id(x => x.Id, map =>
            //{
            //    map.Column("Id");
            //    map.Generator(Generators.GuidComb);
            //});

            Property(x => x.Name, m => m.Length(450));
            Property(x => x.Description, m => m.Length(2000));

            Set(x => x.SubCategories, set =>
                                          {
                                              set.Key(k => k.Column("ParentCategoryId"));
                                              set.Inverse(true);
                                          } ,
                                       ce => ce.OneToMany());

            ManyToOne(x => x.Parent, manyToOne =>
                                         {
                                             manyToOne.Column("ParentCategoryId");
                                             manyToOne.Lazy(LazyRelation.NoLazy);
                                             manyToOne.NotNullable(false);
                                         });


            Set(x => x.Products, set =>
                                    {
                                        set.Key(key =>
                                        {
                                            key.Column("ProductId");
                                            key.ForeignKey("FK_Product_Category_ProductId");
                                        });
                                        set.Table("Product_Category");
                                    },
                                    ce => ce.ManyToMany(m => m.Column("CategoryId")));
        }
    }

Теперь по вопросам:

1) Почему он решил отобразить / смоделировать свойство Parent как отношение ManyToOne? Разве это не говорит о том, что Category может принадлежать более чем одной родительской категории, то есть любая данная категория (кроме корня, я полагаю) может быть распределена среди многих других родительских категорий? Если это так, то это не очень ясно из самой модели, потому что для меня Parent (как я вижу это в определении класса) выглядит как свойство типа Category, и я бы отобразил его так. Когда бы вы выбрали подход в этом решении v.s. отображать это как простое свойство?

2) Когда я сопоставляю файлы, с какой (или какой) перспективы я должен смотреть? Мне кажется, что это изнутри класса, который вы пытаетесь отобразить. Итак, в этом случае, когда я пытаюсь отобразить класс Category, меня интересует только отображение «стрелок», не так ли?

3) Лицо, создающее файлы сопоставления, должно обладать знаниями вне того, что ясно, просто посмотрев на класс. Посмотрите, как отображается свойство Products (отношение ManyToMany). Из самого класса ясно, что Категория может принадлежать многим Продуктам, но Категория не знает, что она может содержаться во многих Продуктах. Этот факт очевиден для класса Product. Теперь, когда я сказал, мне кажется, что при создании файла (-ов) сопоставления я должен смотреть с точки зрения класса И затем на модель.

4) Вообще говоря: когда вы используете .Inverse (), .Cascade () и .Lazy ()?

5) Каковы различия между отображением с использованием ModelMapper и ConventionModelMapper? Я не изучал файлы, включенные в тот же проект, которые используют последний метод, но я хотел бы знать, есть ли преимущество, кроме предпочтения, в использовании одного над другим.

Ответы [ 2 ]

3 голосов
/ 25 октября 2011
  1. Скотт решил создать Обыкновенную ассоциацию (многие-к-одному) между категорией и ее родительской (другой) категорией. Ассоциация «многие к одному» дает вам доступ к таким функциям, как стратегии каскадирования и выборки, которые вы не найдете в сопоставлении свойств. Например, представьте, что вы хотите удалить родителя и всех его потомков. Каскады могут помочь вам.

  2. Если у вас есть ассоциация, вы должны подумать об обеих сторонах ассоциации. Например, скажем, у вас двунаправленная связь один-ко-многим между 'A' и 'B' , вам нужно обратить внимание на то, какая сторона управляет отношениями. Когда вы пишете сопоставление для 'A' , вы думаете о том, как 'A' относится к сущности, и наоборот при сопоставлении 'B' .

  3. Ваша точка зрения немного неясна для меня. Однако то, что вы, похоже, описываете, - это базовые отношения ООП-объекта. Класс может иметь свойство 'A' , которое является отношением к объекту 'B' и 'B' , в свою очередь может относиться к 'C' . Просто взглянув на 'A' , невозможно сказать, что оно транзитивно связано с 'C' . В этом нет ничего плохого.

  4. Прочтите документацию .

    4.1. Инверсия: определяет, какая сторона двунаправленных отношений управляет отношениями.

    4.2 Каскад: Позволяет некоторым операциям каскадировать дочерние ассоциации. (например, удаляет)

    4.3 Lazy: определяет стратегию загрузки коллекции. (Нетерпеливо / Лениво)

  5. ConventionalModelMapper построен поверх ModelMapper и предоставляет удобные методы и соглашения о сопоставлении по умолчанию, которые упрощают сопоставление по соглашениям.

1 голос
/ 25 октября 2011
  • Для 1. Это не означает, что каждая категория имеет много родительских категорий, это означает, что много категорий могут быть выражены в одной родительской категории, и каждая категория может иметьсписок подкатегорий.Если бы это выражалось как один к одному, это означало бы, что в каждой категории есть только одна категория, и я думаю, что вы не хотели этого делать.

  • Для 4. Inverse() используется для указания владельца ассоциации, поэтому вы можете использовать его в отношении «один ко многим», когда дочерний объект не является владельцем отношения или дочерний объект не будет нести ответственность.отношения, и он не будет знать об этом отношении, поэтому, если оно установлено в значение true, NHibernate не будет пытаться вставить или обновить свойства, определенные соединением.

  • Cascade() определяет операции, которые будут каскадно передаваться от родительского объекта к связанным объектам.

  • lazy за ленивую загрузку объектов, на которые ссылаются другие объекты.

  • Для 2. и 3. Я не могу понять вашу точку зренияи что вы имеете в виду, но я думаю, что когда вы отображаете сущность, да, вы должны смотреть с точки зрения класса, который вы отображаете, и то же самое с другой стороны отношения, когда вы отображаете, это выглядит с точки зренияположить в одно и то же время вы должны рассмотреть две стороны отношения.

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