2015-06-22 2 views
0

Я прочитал несколько вопросов и текстов по прикреплению, но они, похоже, пропустят некоторые подробности о том, как это работает. Например, я не знаю, почему происходит следующее:Когда экземпляры Entity автоматически привязаны к контексту?

MyContext c = new MyContext(); 
MyEntity e = new MyEntity(); 
/* some local edits in e */ 
c.MyEntity.Add(e); // Works fine 

Но если я изменить его в зависимости от другого класса (который не создает новый экземпляр), я получаю IEntityChangeTracker исключение:

MyContext c = new MyContext(); 
MyEntity e = new MyEntity(); 
e = ViewModelClass.SomeFunctionWhichAltersAnExistingEntityInstance(e); 
c.MyEntity.Add(e); //IEntityChangeTracker "multiple instances" exception 

Большинство ответов на эту тему говорят, что это происходит, когда объект привязан к нескольким контекстам.

Если это то, что происходит, когда и почему экземпляр класса сущности автоматически привязывается к контексту (и откуда этот контекст)?

О версии Entity используется: RuntimeVersion: v4.0.30319 Версия: 5.0.0.0

+0

Вы задаете свойство основного ключа в своем методе? –

+0

@GeorgeVovos Нет. Это идентификатор (1,1) – galmeida

+0

Вы устанавливаете свойство Navigational внутри метода? Является ли код внутри метода таким же, как/*, локальными изменениями в e * /? Покажите нам метод, если вы можете –

ответ

0

Как вы видели, проблема в том, что ваши навигационные свойства из другого контекста (они отслеживаются другом контексте). Эти объекты отслеживаются другим контекстом. При вызове метод Add EF не только добавляет этот объект в качестве дополнительного, но и всех его навигационных свойств/Ассоциации

Вы можете
1) Пропустите контекст в качестве параметра вашего метода и использовать этот контекст для создания/чтения объекты, которые вы установили как навигационные свойства

2) Используйте .AsNoTracking(), когда вы создаете связанные свойства из другого контекста.
Будьте очень осторожны, в этом случае вызывая метод add с отметкой всего графика объекта как добавленного. Это означает, что EF добавит повторяющиеся записи для каждого навигационного имущества.
Вам нужно будет установить для каждого свойства свойства Navigational Property свойство «Unmodified» (используя метод Entry в контексте) после вызова Add.
Для получения дополнительной информации проверьте это https://msdn.microsoft.com/en-us/magazine/dn166926.aspx

Смежные вопросы