2014-11-22 3 views
1

Я получаю действительно странный глюк, и я считаю, что сущность 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 в новый список элементов. Любое направление по этому вопросу будет принята с благодарностью! Благодаря!

ответ

1

Что вы хотите совершить с Bar s, которые находятся в Foo.Bars, прежде чем назначить newBars?

Вам нужно иметь дело с ними в некотором роде. Они представляются строками в таблице Bar в вашей базе данных, не так ли?

Вы можете удалить эти старые Bar S полностью что-то вроде:

dbContext.Bars.RemoveRange(Foo.Bars); 
dbContext.SaveChages(); 

присваиваемых ваших новых баров:

Foo.Bars = NewBars; 
dbContext.SaveChanges(); 

В качестве альтернативы, если вы все еще хотите старые Bar s существовать в БД но не следует связывать с Foo, то вы можете сделать:

Foo.Bars=null; 
Foo.Bars = newBars; 
dbContext.SaveChanges(); 

(Конечно, это предполагает, что ваша схема db позволяет это без каких-либо ограничений)

+0

Ну, я думаю, что я думал, потому что в некоторых случаях CreateBars, вероятно, генерирует то, что уже было в списке, а иногда может быть будет генерировать другой список. Но в принципе в любом случае, я просто хотел написать все значения, которые уже были в базе данных. И тогда, если бы появились новые значения, просто добавьте их. Но я думаю, что всегда мог просто очистить списки до того, как я сгенерировал новые наборы. –

+0

Вы также можете изменить «CreateBars()», чтобы вытащить существующие записи, а не создавать новые с тем же идентификатором. Если вы делаете что-то вроде 'newBar = dbContext.Bars.Find (id)', а не 'newBar = new Bar {... ....} ', вы не должны иметь такую ​​же проблему, добавляя результаты в возвращенный список –