Возможно ли ORM с Entity Framework? - PullRequest
0 голосов
/ 06 июля 2011

Мы пытаемся реализовать слой данных с ORM между нашими объектами домена и нашими таблицами, используя EF.Мы успешно выполнили тривиальные сопоставления с сущностями домена, которые очень похожи на их соответствующие таблицы, но запутались, пытаясь отобразить объекты с более сложными отношениями, которые включают внешние ключи в свои представления таблиц.Я нашел множество ссылок на «Разделение таблиц» с использованием EF с таблицами, которые имеют первичные ключи, но это не относится к нашей схеме.

В качестве примера я хотел бы иметь доменные объекты в качестве POCOне более осведомлены о слое данных, чем простые идентификаторы:

public class EntityInfo
{
    public int EntityId { get; set; }
    public string EntityName { get; set; }
    public string TypeName { get; set; }
    public string ComponentName { get; set; }
}

public class Entity
{
    public int EntityId { get; set; }
    public EntityType Type { get; set; }
    public EntitySource Source { get; set; }
    public string Name { get; set; }
}

public class EntityType
{
    public int TypeId { get; set; }
    public string Name { get; set; }
}

public class EntitySource
{
    public int SourceId { get; set; }
    public string Name { get; set; }
}

Они будут сопоставлены с серией эквивалентных таблиц с внешними ключами:

Table Entities:
[PK]    int     EntityId
[FK]    int     TypeId
[FK]    int     SourceId
        string  Name

Table EntityTypes:
[PK]    int     TypeId
        string  Name

Table EntitySources:
[PK]    int     SourceId
        string  Name

Что нам действительно нужнодля этого нужно полностью отделить представление таблицы от сущностей домена и реализовать слой отображения (.msl) для разрешения этих довольно сложных отношений.Приведенный выше класс EntityInfo будет создаваться и храниться в таблицах, несмотря на то, что у него нет собственного представления в виде таблицы.Возможно ли такое сопоставление (иерархия нескольких таблиц к объектам) даже с использованием .msl?Возможно ли это с EF?

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

Ты хотя бы попробовал?В представленной модели нет сложного картирования.Это самое основное отображение отношений один-ко-многим.Просто откройте EDMX в конструкторе и выполните команду «Обновить из базы данных» (из контекстного меню).Выберите три таблицы в мастере и снимите флажок для добавления внешних ключей в модель.

Редактировать:

Да, каркас сущности может отображать даже ваш EntityInfo объект, но объект будеттолько для чтения, поскольку вся информация о том, какие связанные объекты (их отношения с FK) включены, будет потеряна.Есть два способа отобразить это:

  • Использовать DefiningQuery в SSDL.DefiningQuery - это пользовательский SQL, используемый для загрузки столбцов, которые вы хотите отобразить.EF не беспокоится о том, сколько таблиц вы объединяете, чтобы получить набор результатов.Проблема заключается в том, что дизайнер по умолчанию будет удалять ваш DefiningQuery каждый раз, когда вы пытаетесь обновить модель из базы данных .
  • Использовать QueryView в MSL.QueryView - это настраиваемое представление Entity SQL, сопоставленное с новым объектом.Он построен на сущностях, определенных в вашей модели.Таким образом, вы должны также отобразить Entity, EntityType и EntitySource (но вы можете сделать их, например, внутренними для вашей сборки данных).QueryView сохраняет обновления из базы данных.

Оба DefiningQuery и QueryView должны быть определены непосредственно в EDMX (открыт как XML), потому что дизайнер не поддерживает их.Эти функции недоступны при первом подходе к коду.Эти функции создают объекты, доступные только для чтения, поэтому, если вы хотите также выполнять операции CUD, вы должны создать хранимые процедуры и сопоставить их с вновь созданными объектами.

Существует также последний наиболее часто используемый вариант - вы можете создать запрос linq-to-entity, просто проецируя ваши сопоставленные сущности на unmapped EntityInfo:

var infos = context.Entities
                   .Select(e => new EntityInfo
                        {
                            EntityId = e.EntityId,
                            EntityName = e.Name,
                            TypeName = e.Type.Name,
                            ComponentName = e.Source.Name 
                        });              
0 голосов
/ 06 июля 2011

IIRC Entity Framework 1.0 не позволяла отделить сущности от таблиц. Но я уверен, что вы можете сделать это с EF 4.0

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