EF5 — база данных сначала создает таблицу «многие ко многим»

У меня есть отношение «многие ко многим» в моей БД:

CREATE TABLE [dbo].[PositionRequirements](
    [Position_ID] [int] NOT NULL,
    [Requirement_ID] [int] NOT NULL,
 CONSTRAINT [PK_PositionRequirements] PRIMARY KEY CLUSTERED 
(
    [Position_ID] ASC,
    [Requirement_ID] ASC
)

Когда я создаю модель в EF5, я вижу не таблицу, а ассоциацию с двумя коллекциями каждой стороны в соответствующих таблицах FK. Итак, у меня есть коллекция Positions в Requirements и коллекция Requirements в Positions. Справедливо, я понимаю, что здесь происходит.

Я наткнулся на этот вопрос, показав, как удалить строку «многие ко многим»:

Как добавить или удалить отношения «многие ко многим» в Entity Framework?

Проблема в том, что я не вижу способа обобщить эту функциональность, однако, если бы в модели была определена таблица, я вижу, что это было бы относительно легко.

Есть ли способ «обмануть» EF для создания таблицы MM, а не коллекций ассоциаций?

Я видел эту страницу вместе с использованием интерфейса IDatabaseInitializer<>, однако она не работает - я не вижу таблицы на диаграмме.

Это упростило бы многое в моем текущем проекте.


person Simon    schedule 08.08.2013    source источник
comment
Что произойдет, если вы добавите дополнительное скалярное свойство в таблицу соединений?   -  person Dabblernl    schedule 08.08.2013
comment
Великолепно, спасибо... так просто (хотя и немного хакерски, но со своей задачей справляется!)   -  person Simon    schedule 08.08.2013
comment
Чтобы было ясно, вам нужно добавить еще одно поле в БД, удалить ассоциацию (также обе таблицы!), А затем обновить модель из БД, которая создаст новую таблицу.   -  person Simon    schedule 08.08.2013
comment
По крайней мере, теперь мы установили, что такое поведение является преднамеренным. Должна быть возможность переопределить его. Возможно, кто-то еще придет с реальным ответом на ваш вопрос :-). Тем временем вы можете продолжить поиск обходного пути.   -  person Dabblernl    schedule 08.08.2013


Ответы (1)


Надеюсь, это поможет. В моем сценарии у меня есть список со встроенными флажками для каждого элемента. Я хочу иметь возможность добавлять/удалять отмеченные элементы.

Объект dto ниже отправляется от клиента. Он проверяет выбранное состояние для каждого элемента в списке. Если кто-то знает какой-либо способ улучшить это, пожалуйста, оставьте отзыв.

Схема БД: [logger] m:m [logger_to_file_appender] m:m [file_appender] В моей соединительной таблице есть только 2 поля, FK, которые действуют как составной ключ. Как вы заметили, файл EDMX не будет содержать эту соединительную таблицу. Ниже мое решение....

file_appender selectedAppender = context.file_appender.Find(dto.Id);

int[] ids = dto.Loggers.Where(x => !x.Selected).Select(x => x.Id).ToArray();
var loggers_to_delete = selectedAppender.logger.Where(x => ids.Contains(x.id));
loggers_to_delete.ToList().ForEach(x =>
{
    selectedAppender.logger.Remove(x);
});

ids = dto.Loggers.Where(x => x.Selected).Select(x => x.Id).ToArray();
var loggers_to_add = context.logger.Where(x => ids.Contains(x.id));
loggers_to_add.ToList().ForEach(x =>
{
    selectedAppender.logger.Add(x);
});

Иногда работа в Entity Framework может разочаровывать, потому что что-то вроде этого, на что у меня ушло бы 2 минуты в T-SQL, заняло у меня около дня, чтобы освоить :(. Надеюсь, это знание сэкономит кому-то часы.

person spyder1329    schedule 02.02.2017