Создание модели сущности с таблицей перекрестных ссылок - EntityFramework 4.1 - PullRequest
0 голосов
/ 23 марта 2012

Вот мой сценарий (таблицы):

Departments
====================
Id (int)
Name (varchar)

Employees
====================
Id (int)
Name (varchar)

EmployeesDepartmentXREFs
====================
EmployeeId (int)
DepartmentId (int)

Когда я импортирую эти 3 таблицы в модель EDMX, я получаю 2 объекта: Сотрудник и Отдел. У сущности Employee есть навигационное свойство Департаменты и у сущности Department есть навигационное свойство Employees.

И это все хорошо. Мне действительно так нравится.

Но проблема начинается, когда я хочу добавить больше полей в таблицу XREF, например, я хотел бы иметь поля DateCreated, UserId для записи, когда вносятся изменения и кем. Если я добавлю эти два поля в таблицу XREF, то моя модель EDMX покажет 3 объекта вместо двух. Это не большая проблема, но так как я уже закончил с кодированием, я как бы ищу простое решение (чтобы избежать кодирования).

Вопрос: Можно ли добавить новые поля в таблицу XREF (перекрестные ссылки) и сохранить только две сущности? Если да, как мне обновить информацию о дате и времени использования?

Я предполагаю, что сущность XREF должна присутствовать, чтобы иметь возможность обновлять ее (с датой и идентификатором пользователя), но мне действительно нравятся навигационные свойства: Отделы и Сотрудники вместо навигационных свойств EmployeesDepartmentXREFs .

Есть ли что-то среднее для этого? Какова лучшая практика?

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 марта 2012

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

public class Department
{
    //...
    public ICollection<EmployeesDepartment> EmployeesDepartments { get; set }

    // because here is only a getter the property is ignored for mapping to DB
    public IEnumerable<Employee> Employees
    {
        get { return EmployeesDepartments.Select(ed => ed.Employee); }
    }
}

Но для этого необходимо, чтобы вы либо уже загрузили EmployeesDepartments, включая Employee из базы данных, либо использовали отложенную загрузку (отметьте навигациюсвойства как virtual) и контекст, в который загружен отдел, еще не удален.Кроме того, это свойство бесполезно для добавления или удаления отношений между Department и Employee.

В любом случае требуется написать собственный код.Невозможно ввести свойство с помощью автоматического метода получения и установки и указать отображение, которое каким-то образом «пропустит» промежуточную сущность.Ваша модель просто больше не имеет отношения «многие ко многим», когда вы добавляете свойства в таблицу соединений, и рекомендуется рассматривать ее как два отношения «один ко многим».

1 голос
/ 24 марта 2012

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

UPDATE

Посмотрев вокруг, я нашел этот вопрос форума MSDN , который звучит так, как будто он написан перед первым кодом (который, я считаю, позволяет использовать более двух столбцов в таблице сопоставления через свободный API) и подходит ваша проблема.

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

Последнее, Вот хорошая статья по вашей проблеме.

Надеюсь, это поможет вам / прояснит ситуацию.

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