Структура сущности: база данных сначала / код первого гибрида - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь создать пользовательскую сущность Entity Framework (4.2), которая будет отображаться в моей базе данных, как это было бы сделано в подходе Code first.

Проблема заключается в том, что моя модель данных Entity FrameworkСначала используйте базу данных.

Как добавить свой пользовательский объект в контекст инфраструктуры объектов?

1 Ответ

1 голос
/ 28 ноября 2011

Если под базой данных вы имеете в виду, что у вас уже есть EDMX, созданный на основе выходящей базы данных, вы просто не сможете сначала использовать код.Необходимо создать таблицу и обновить модель (EDMX) из базы данных, чтобы включить ее в EDMX.

Редактировать на основе комментария:

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

Ну, это возможно.Вы можете создать BriefUser как общий класс и использовать проекцию в запросе.

var breifUser = (from x in context.Users
                 where ...
                 select new BriefUser
                 {
                     // Fill BreifUser's properties here
                 }).FirstOrDefault();

Вы можете даже преобразовать прежний код в метод многократного расширения:

public static IQueryable<BriefUser> ProjectUser(this IQueryable<User> query)
{
    return query.Select(x => new BreifUser() 
                             { // Fill BreifUser's properties here });
}

и использовать его следующим образом:

var briefUser = context.Users.ProjectUser().FirstOrDefault(...);

Также возможно определить вашновый класс как «вид сущности».Первая проблема заключается в том, что каждую таблицу можно сопоставить только одной сущности (за исключением некоторых расширенных понятий, таких как наследование или разбиение), поэтому вы не можете определить свой BriefUser как новый тип сущности, поскольку сопоставление User и BriefUser с UserTbl будетнарушать это правило.Вы должны использовать специальную конструкцию под названием QueryView .

QueryView - вид на уровне отображения.Это позволяет вам создавать новый сопоставленный тип, который является проекцией существующих сопоставленных сущностей, определенных непосредственно в части EDMX MSL.Проекция определяется как пользовательский запрос Entity SQL.Проблема в том, что QueryView имеет ограничения:

  • Он не предлагает все функции Entity SQL - например, он не поддерживает агрегирование (которое я считаю действительно отсутствующим компонентом).Без агрегатов, например, вы не сможете создать новый тип, который будет содержать свойство, подсчитывающее некоторые связанные сущности.
  • Это не поддерживается в конструкторе.Вы должны отредактировать свой EDMX как XML, чтобы определить QueryView, и вы должны сами написать запрос Entity SQL.
  • Результирующий тип является «представлением» и доступен только для чтения.

Я хочу сохранить файл EDMX, но также могу добавить объект (BriefUser) в контекст EF.

Это невозможно.Ваш BreifUser является только проекцией / видом, и EF не может отслеживать изменения обратно в исходные таблицы, поэтому вы не можете добавить BreifUser в контекст и сохранить его.В случае QueryView вы можете достичь этого, если определите пользовательские хранимые процедуры, которые не будут разбивать BreifUser и изменить все связанные таблицы.Эти хранимые процедуры должны быть импортированы в EDMX и сопоставлены с операциями изменения данных объекта представления.Btw.то же самое произойдет, если вы сопоставите свою сущность с представлением базы данных, поскольку EF принимает все представления только для чтения.

...