Добавление связи без запроса базы данных

#c# #optimization #entity-framework-4 #linq-to-entities

#c# #оптимизация #entity-framework-4 #linq-to-entities (linq-to-entities)

Вопрос:

Я знаю, что видел это, но я нигде не могу найти это.

У меня есть пара объектов с отношением «многие ко многим»: Person и Department. У человека может быть много отделов и наоборот.

Я думал, что это:

 var person = //query user

var d = new Department();
d.Id = 123;

person.Departments.add(d);
  

Это создает новый отдел в базе данных и связывает их, но это не то, что я хочу. Отдел уже существует. Я просто хочу создать связь. Как я могу сделать это без необходимости запрашивать базу данных для получения экземпляра отдела?

Комментарии:

1. Я думаю, вы хотите выбрать d вместо его создания

Ответ №1:

Попробуйте это:

 var department = dbContext.Departments.FirstOrDefault(d => d.Id == 123);
person.Departments.Add(department);
dbContext.SaveChanges();
  

Это не должно запрашивать базу данных до тех пор, пока не будет вызван dbContext.SaveChanges() , поскольку используется отложенный запрос. Однако, если это не сработает, вы можете попробовать обновить объект сопоставления напрямую вместо этого:

 var departmentMember = new DepartmentMember
                           {
                               DepartmentId = 123,
                               MemberId = person.Id
                           };

dbContext.DepartmentMembers.Add(departmentMember);
dbContext.SaveChanges();
  

Ответ №2:

Как насчет:

 person.Departments.Add(context.Departments.First(c=>c.Id==123));
  

Комментарии:

1. Не будет context.Departments.First(c=>c.Id==123) запрашивать базу данных?

2. о, извините, теперь я понимаю ваш вопрос

3. возможно, вам придется обновить базовые таблицы с помощью необработанной вставки sql? Я не знаю другого способа, но, возможно, кто-то другой сделает