#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. Можете ли вы опубликовать пример этого в действии? Было бы полезно для других