Змінюй хід війни! Допомагай ЗСУ!

Help, проблема с EF и Many-To-Many

🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
Статус: Offline
Реєстрація: 10.06.2006
Повідом.: 3031
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #1
Всем привет, последний EF, code first.

Есть 2 сущности: A и B. Есть 3 таблицы: A, B, AB

Маппинг таблиц работает, в OnModelCreating связка ManyToMany описана так:
modelBuilder.Entity<A>()
.HasMany(e => e.B)
.WithMany(e => e.A)
.Map(m => m.ToTable("AB").MapLeftKey("A_Id").MapRightKey("B_Id"));

Соответственно, A имеет референс:
class A
...
public virtual ICollection<B> Bs{get;set;}

и так же с B




При создании A, я добавляю в коллекцию Bs существующие B и после SaveChanges в таблице AB вижу новые записи.
Проблема в том, что при обновлении сущности A (я меняю содержимое коллекции Bs) в таблице AB никаких изменений не происходит.
Я помечаю A как modified перед сохранением (отдельные поля A после изменения сохраняются), но связка AB не меняется в БД)

Помогите!



В профайлере идёт апдейт только сущности A, AB игнорируется. интродюсить сущность AB - проекцию таблицы AB я не хочу.
 
Останнє редагування:
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #2
как маппинг узнает что твой Bs и есть "многие" в А?
 
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #3
...
modelBuilder.Entity<A>()
.HasMany(e => e.B)
.WithMany(e => e.A)
.Map(m => m.ToTable("AB").MapLeftKey("A_Id").MapRightKey("B_Id"));
 
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #4
это был направляющий вопрос.
допустим ты имеешь в A не только Bs, но и такую же коллекцию ICollection<B> Bsx{get;set;}. Как мапперу понять что нужно писать связи именно сущности A и его член Bs, а может по задумке и нужно связывать Bsx? а может и нет.
 
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #5
Вот это может поможет:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


Наиболее простое решение, по-моему - явно вызывать
Код:
context.ChangeTracker.DetectChanges();
после модификации коллекции, или в SaveChanges методе контекста, без того, чтобы заморачиваться изменением состояния релейшеншипа через ObjectContext
 
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #6
Попробуй убрать весь свой код в OnModelCreating. 100% уверен что у меня это работало, без всяких кастомных маппингов. Последние версии EF, отлично понимают что означают такие проперти:
public virtual ICollection<B> Bs{get;set;}

маппинг нужен если у тебя имя проперти не стандартное
 
  • 🟡 00:47 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #7
В общем, данная проблема решается странным образом: чтобы обновились релейшны, нужно модель A загружать из базы (наприме, context.Find(...) ), и после этого в ней менять Bs.
У меня модель автоматически собирается из полей веб-формы. т.е., при нажатии кнопки save на форме, я получаю модель, далее, загружаю эту же модель (далее, realA) из БД, и ручками устанавливаю все значения:realA.Name = A.Name; .....
после чего я устанавливаю state для realA modified и вызываю SaveChanges.
как сами видите, мне это решение не нравится, потому что приходится руками все проперти сеттить.
 
Назад
Зверху Знизу