none
О CodeFirst EntityFramework RRS feed

  • Вопрос

  • Сделал себе модель и контекс, база появилась со всеми нужными ключами, и интересуют маппинги к модели, не про настроек полей типа 

    Property(x => x.Name).HasMaxLength(20);

    я о том что если написать

    HasMany(x => x.Students).WithRequired(x=>x.University).HasForeignKey(x=>x.UniversityId);

    получится тоже самое что ее не написать, разница только в том что в модели Students появится поле UniversityId, но можно же достучатся к нему и по Students.University.UniversityId.

    В таблице Universities никакой разницы.

    Мне не удается понять смысл этих маппингов, ведь Entity сама всё делает(на счет связей), и мучает вопрос, надо ли это делать вообще, все ведь итак работает. Почему их надо использовать?


    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);






    11 апреля 2014 г. 18:57

Ответы

  • "Мне не удается понять смысл этих маппингов, ведь Entity сама всё делает(на счет связей), и мучает вопрос, надо ли это делать вообще, все ведь итак работает. Почему их надо использовать?" - не всегда их нужно использовать, если нет нужды не используйте. Просто бывают случаи, когда простым языком не объяснить EF что нужно сделать. Вот тогда и нужно их использовать.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Medet Tleukabiluly 12 апреля 2014 г. 16:27
    12 апреля 2014 г. 13:33
    Модератор

Все ответы

  •  А если дефолтное поведение не устраивает, скажем нужно создать таблицу с конкретным именем? Вот тут на помощь и приходят маппинги, с помощью которых можно и задать набор правил по которым разворачиваются таблицы. 
    11 апреля 2014 г. 19:25
  • это все прекрастно но вопрос о связях. Маппинги не дают никакого эффекта в плане отношении в таблицах, или я не прав?

    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);

    11 апреля 2014 г. 19:29
  • Честно говоря, я их особо не использовал, вот что нашел быстрым нагугливанием на русском языке:

    Entity Framework - mapping 1

    Entity Framework - mapping 2

    11 апреля 2014 г. 19:36
  • Почему их надо использовать(кроме "HasMaxLength(20)" и прочие методы которых можно задать в аннотациях)?

    Ну и вообще - маппинги - удобная штука для работы с POCO моделями, к примеру если не желательно или не возможно понавешивать на свойства классов атрибуты. Нужно стремиться отделять данные от логики, для этого хорошо их использовать.


    11 апреля 2014 г. 19:56
  • Почему их надо использовать(кроме "HasMaxLength(20)" и прочие методы которых можно задать в аннотациях)?

    Ну и вообще - маппинги - удобная штука для работы с POCO моделями, к примеру если не желательно или не возможно понавешивать на свойства классов атрибуты. Нужно стремиться отделять данные от логики, для этого хорошо их использовать.


    1. Атрибуты можно "понавешивать" на любое поле класса

    2. Маппинг это не логика.

    3. Вопрос не про крутость конфигурации с помощью Code First, о том какая разница между этим

    modelBuilder.Entity<University>().HasMany(x => x.Students).WithRequired(x=>x.University).HasForeignKey(x=>x.UniversityId);


    и этим

    public class University
        {
            public int Id { get; set; }
            public ICollection<Student> Students { get; set; }
        }

    если не задавать маппинг то результат идентичен.

    4. Честно говоря, я их особо не использовал, вот что нашел быстрым нагугливанием на русском языке: это я и сам могу

    5. Читайте внимательней


    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);

    11 апреля 2014 г. 20:08
  • "Мне не удается понять смысл этих маппингов, ведь Entity сама всё делает(на счет связей), и мучает вопрос, надо ли это делать вообще, все ведь итак работает. Почему их надо использовать?" - не всегда их нужно использовать, если нет нужды не используйте. Просто бывают случаи, когда простым языком не объяснить EF что нужно сделать. Вот тогда и нужно их использовать.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Medet Tleukabiluly 12 апреля 2014 г. 16:27
    12 апреля 2014 г. 13:33
    Модератор
  • спасибо. если нет необходимости - не надо использовать. прекрасно.


    if (Thread.Was == HelpFul) Mark.As(HelpFul); else if (Thread.Was == Answered) Mark.As(Answered); else Provide(More.Details);

    12 апреля 2014 г. 16:27
  • 1. Атрибуты можно "понавешивать" на любое поле класса

    Если есть исходники. Модели могут быть в какой-то отдельной сборке в виде .dll

    2. Маппинг это не логика.

    Маппинг - это не данные. Можно сказать, это инструкции, и я считаю, что лучше вынести их в отдельное место. Да и вообще не люблю захламлять модели лишними атрибутами

     не всегда их нужно использовать, если нет нужды не используйте. 

    Тут у меня вопрос. Если у меня "чистые" модельки, без каких либо атрибутов, я обязан же с помощью маппингов, по крайней мере,  указать кто из полей - Primary Key?

    Вот, скажем, моделька:

        public class IntervalSystem
        {
            /// <summary>
            /// Gets or sets the iterval system id.
            /// </summary>
            public int ItervalSystemId { get; set; }
    
            /// <summary>
            /// Gets or sets the name.
            /// </summary>
            public string Name { get; set; }
    
            /// <summary>
            /// Gets or sets the category.
            /// </summary>
            public string Category { get; set; }
    
            /// <summary>
            /// Gets or sets the halftones.
            /// </summary>
            public ICollection<Halftone> Halftones { get; set; }
        }


    Но при попытке выполнить команду Update-Database, получаю:

    EntityType 'IntervalSystem' has no key defined. Define the key for this EntityType.
    IntervalSystems: EntityType: EntitySet 'IntervalSystems' is based on type 'IntervalSystem' that has no keys defined.

    Выходит, как бы мне не хотелось, я вынужден, или добавить атрибут (что я делать не буду), либо добавить маппинги?


    13 апреля 2014 г. 12:05
  • Если назовёте имя свойства IntervalSystemId, то согласно принятым соглашениям в EF, именно он будет первичным ключём. В этом случае ни понадобятся ни мапинги ни атрибуты.

    "Выходит, как бы мне не хотелось, я вынужден, или добавить атрибут (что я делать не буду), либо добавить маппинги?" - ели не придерживаться соглашений, то да. Иначе невозможно. А вот к атрибутам я бы не стал относиться так категорично. Использовать их предпочтительней, нежели методы, если без последних можно будет обойтись.


    Сделаем содержимое сообщества лучше, вместе!

    13 апреля 2014 г. 12:50
    Модератор