Я получаю действительно странный глюк, и я считаю, что сущность Framework виновата. Вот основной сценарий, который продолжается. У меня есть объект entity, Foo, с коллекцией свойств навигации, Bar. Foo в этом контексте отслеживается отслеживанием изменений структуры сущностей. я запускаю следующий код, но результат очень странноC# entity framework, изменяющий содержимое моих списков
var NewBars = CreateBars(); //CreateBars returns a List<Bars> with two items
//After this code is ran, Foo.Bars AND NewBars will both be lists with 4 items.
//I think its because Foo.Bars has dynamic proxies, entity framework edits bars
//To re-insert the overwritten proxies.
Foo.Bars = NewBars;
Если я ставлю точку останова NewBars = CreateBars() линии вар, и шаг за шагом через него кусок за куском, все выйдет, как и ожидалось. Foo.Bars будет списком двух элементов, NewBars будет двумя списками. Но если я запустил выполнение без точек останова, или если я сломаю точку после того, как я установил Foo.Bars = NewBars, то оба этих списка чудесным образом меняются на 4 списка элементов. Странно мне, что меняется даже список правых значений.
В какой-то момент, даже когда у меня было исполнение, остановленное в точке останова, я проверил содержимое новых панелей, и в первый раз я посмотрел 2, а затем 4 в следующий раз, когда посмотрел. Он изменился, когда программа была остановлена, поэтому я знаю, что что-то происходит за кулисами.
Проблема в том, что, поскольку она сохраняет повторные вставки прокси, я получаю конфликты первичного ключа. Если прокси не вставляются повторно, тогда все в порядке. Мне просто интересно, как мне решить эту проблему? Я просто хочу установить Foo.Bars в новый список элементов. Любое направление по этому вопросу будет принята с благодарностью! Благодаря!
Ну, я думаю, что я думал, потому что в некоторых случаях CreateBars, вероятно, генерирует то, что уже было в списке, а иногда может быть будет генерировать другой список. Но в принципе в любом случае, я просто хотел написать все значения, которые уже были в базе данных. И тогда, если бы появились новые значения, просто добавьте их. Но я думаю, что всегда мог просто очистить списки до того, как я сгенерировал новые наборы. –
Вы также можете изменить «CreateBars()», чтобы вытащить существующие записи, а не создавать новые с тем же идентификатором. Если вы делаете что-то вроде 'newBar = dbContext.Bars.Find (id)', а не 'newBar = new Bar {... ....} ', вы не должны иметь такую же проблему, добавляя результаты в возвращенный список –