Entity Framework 4.1 Код первого сопоставления / заполнения одного свойства из двух столбцов базы данных

#ef-code-first #entity-framework-4.1

#ef-code-first #entity-framework-4.1

Вопрос:

Я знаю, что этот вопрос был задан / на него был дан ответ, но я не могу найти его ни за что на свете.

Я создаю и ASP.NET Приложение MVC 3 с существующей БД, но хотел сначала перейти к кодированию, поэтому я использовал EF Power Tools CTP1, чтобы начать. В конечном счете, я проведу рефакторинг для лучшего решения, но для начала я использовал MVCScaffolding для создания контроллеров и представлений. Я пытаюсь создать свойство отображаемого значения ( FullName ) в моей модели, которое представляет собой комбинацию столбцов FirstName и LastName в БД.

У меня есть простой класс

 public class Manager
{
    public Manager(){}

    public int ManagerID { get; set; }

    [DisplayName] // Not in db.. want to populate this from first amp; last name 
    public  string FullName { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}
  

и файл сопоставления, который выглядит как

      public ManagerMap()
    {
        // Primary Key
        this.HasKey(t => t.ManagerID);

        // Table amp; Column Mappings
        this.ToTable("Manager");
        this.Property(t => t.ManagerID).HasColumnName("ManagerID");

        this.Property(t => t.FirstName).HasColumnName("FirstName");
        this.Property(t => t.LastName).HasColumnName("LastName");
        this.Property(t => t.Email).HasColumnName("Email");
        this.Property(t => t.FullName).WhatToDo..? //<-- Can I / how does this mapping look

    }
}
  

Возможно ли создать FullName сопоставление или я иду по этому совершенно неправильному пути?

Ответ №1:

Нет, создать FullName сопоставление невозможно. Но вы можете использовать этот простой обходной путь:

 public class Manager
{
    public Manager(){}

    public int ManagerID { get; set; }

    [NotMapped]
    public string FullName 
    { 
       get
       {
           return FirstName   " "   LastName;
       }
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}
  

Единственным недостатком этого подхода является то, что вы не можете использовать FullName свойство в запросе linq-to-entities (поэтому вы не можете, например, упорядочивать или выполнять поиск по FullName — вы все равно должны использовать FirstName и LastName ).

Если вы используете функцию генерации кода new Power Tools, вам действительно следует объявить это свойство в отдельном частичном классе, как предложил @Steve Mallory — не модифицируйте сгенерированный код, если вы когда-нибудь захотите его восстановить.

Комментарии:

1. Вы все еще можете фильтровать по нему, пока коллекция объектов находится в памяти, правильно?

2. Да, вы можете фильтровать по нему при использовании linq для объектов

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

Ответ №2:

Я бы не стал сопоставлять поле в базе данных. Вместо этого я бы объявил свой POCO частичным. В другом файле у меня был бы тот же частичный класс и я определил бы там значение комбинации (используя только средство получения). У меня есть пример кода, если он вам нужен.

Сохранение его в отдельном файле помогает, если вы выполняете какую-либо генерацию кода позже.

Комментарии:

1. Можете ли вы опубликовать пример этого в действии? Было бы полезно для других