2015-01-09 3 views
0

Я разрабатываю первое приложение базы данных в VB.NET, используя сущность framework версии 6.1.1 и sql server 2008. У меня есть некоторые чистые таблицы соединений, которые связывают многие и многие отношения между двумя таблицами. Мои сущности не отслеживаются.Entity Framework 6 Навигационные коллекции свойств

Вот основные примеры классов (порожденных от EF Tt файлов), которые я использую:

Public Class Part 
    Public Property id As Long 
    Public Property name As String 
    Public Overridable Property CarModels As ICollection(Of CarModel) = New HashSet(Of CarModel) 
End Class 

Public Class CarModel 
    Public Property id As Long 
    Public Property name As String 
    Public Overridable Property Parts As ICollection(Of Part) = New HashSet(Of Part) 
End Class 

Когда я обновить поля для объекта, я установить значение, а затем включить код, как это:

obj.Name = "New Name" 
context.Entry(obj).State = EntityState.Modified 
context.SaveChanges 

Это сохранит значение Name в базе данных, как я ожидаю. Моя проблема заключается в том, чтобы добавить новую CarModel в существующую часть или удалить существующую CarModel из части. Я пробовал несколько вещей, но не нашел решения. Вот пример моего кода:

Dim p As Part = context.Parts.where(Function(it) it.id.equals(1)).first 'Part I am working with 
Dim c As CarModel = context.CarModels.where(Function(it) it.id.equals(1)).first 'Car Model I want to associate to the part 
p.CarModels.Add(c) 'Add the Car Model to the part collection 

context.Entry(p).State = EntityState.Modified 

context.SaveChanges 

Ошибка не выбрасывается. Когда я отлаживаю, CarModel добавляется в коллекцию Part.CarModel. Однако изменения не привязаны к базе данных. Если я добавлю новую часть и использую аналогичный код, она будет работать, но я не могу добавить или удалить из существующей коллекции и получить ее для фиксации в базе данных.

ответ

0

Я взглянул на самом контексте, и эта линия была в конструкторе контекста:

Configuration.AutoDetectChangesEnabled = False 

То есть то, что было причина моей конкретной проблемы. Я где-то читал (после того, как нашел эту строку), что рекомендуется не включать set AutoDetectChangesEnabled в значение false, если не выполняется очень длительный процесс, и в этом случае вернуть его в true после завершения процесса. Удаление этой строки из конструктора контекста решило мою проблему.

0

Я не использовал VB через 6 лет, так что это может быть не совсем правильно, но это даст вам общее представление о том, как это работает.

Dim p As Part = context.Parts.where(Function(it) it.id.equals(1)).first 'Part I am working with 
Dim c As CarModel = context.CarModels.where(Function(it) it.id.equals(1)).first 'Car Model I want to associate to the part 

Dim newPart As Part = New Part() 
newPart.id = p.id 
newPart.name = p.name 
newPart.CarModels = c 

context.Add(p) 

context.SaveChanges() 
+0

Спасибо за ваше предложение. Я дал эту попытку и получил аналогичные результаты. Проблема была вызвана установкой в ​​моем контексте, объясненной в моем ответе. – ccarter24

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