Я создаю репозиторий для нового приложения, которое использует Entity Framework 5 в качестве исходного источника данных. У меня есть основная операция CRUD, работающая для простых моделей, но я изо всех сил пытаюсь понять, как обновлять связанные объекты при обновлении до объекта exising.Шаблон хранилища с Entity Framework 5. Обновление связанных объектов
Модель
Импорт Система Импорт System.Collections.Generic
Partial Public Class tblUser
Public Property idUser As Integer
Public Property username As String
Public Property pwd As String
Public Overridable Property tblUsermmRoles As ICollection(Of tblUsermmRole) = New HashSet(Of tblUsermmRole)
End Class
Imports System
Imports System.Collections.Generic
Partial Public Class tblUsermmRole
Public Property idUser As Integer
Public Property idRole As Integer
Public Overridable Property tblUser As tblUser
Public Overridable Property tblUserRole As tblUserRole
End Class
Я пытаюсь добавить записи в объект tblUsermmRole противсвязанной с tblUser, но я не могу заставить обновление работать.
ПОКО
Public Class User
Public Property ID As Int32
Public Property Username As String
Public Property Password As String
Public Property AccessRoles As IEnumerable(Of Int32)
Public Sub New()
End Sub
Public Sub New(id As Int32, userName As String, password As String, roles As List(Of Int32))
Me.ID = id
Me.Username = userName
Me.Password = password
Me.AccessRoles = roles
End Sub
End Class
Public Class UserRoles
Public Property RoleID As Int32
Public Sub New(roleID As Int32)
Me.RoleID = roleID
End Sub
End Class
Repository
Imports System.Data.Entity
Namespace DataAccess.Repository
Public MustInherit Class EntityFramworkContextBase
Inherits DbContext
Implements IUnitOfWork
Public Sub New(entityConnectionStringOrName As String)
MyBase.New(entityConnectionStringOrName)
End Sub
Public Sub Add(Of T As Class)(obj As T) Implements IUnitOfWork.Add
[Set](Of T).Add(obj)
End Sub
Public Sub Attach(Of T As Class)(obj As T) Implements IUnitOfWork.Attach
Dim entity As T
If ExistsInContext(obj) Then
entity = ObjectInContext(obj)
Entry(entity).CurrentValues.SetValues(obj)
Else
entity = [Set](Of T).Attach(obj)
End If
Entry(entity).State = EntityState.Modified
End Sub
Public Sub Commit() Implements IUnitOfWork.Commit
MyBase.SaveChanges()
End Sub
Public Function [Get](Of T As Class)() As IQueryable(Of T) Implements IUnitOfWork.Get
Return [Set](Of T)()
End Function
Public Function Remove(Of T As Class)(obj As T) As Boolean Implements IUnitOfWork.Remove
Dim entity As T
If ExistsInContext(obj) Then
entity = ObjectInContext(obj)
Else
entity = [Set](Of T).Attach(obj)
End If
[Set](Of T).Remove(entity)
Return True
End Function
Private Function ExistsInContext(Of T As Class)(obj As T) As Boolean
Return [Set](Of T).Local.Any(Function(o) o.Equals(obj))
End Function
Private Function ObjectInContext(Of T As Class)(obj As T) As T
Return [Set](Of T).Local.FirstOrDefault(Function(o) o.Equals(obj))
End Function
End Class
End Namespace
Проблема
При вызове линии Entry(entity).CurrentValues.SetValues(obj)
в методе Attach
основные свойства копируются, но новые элементы для объекта tblUsermmRole отсутствуют.
Новый объект с обновленной
Entity после SetValues
Из первоначальных исследований он выглядит как метод SetValues
не копировать связанных с навигационными свойствами, как описано в this post
Вопрос
Учитывая шаблон репозитория (плюс шаблон UnitOfWork), который я использую, как вы поддерживаете отношения между объектным графом и обновляете базу данных?
Дополнительное примечание
Этот метод работает, как ожидалось для новых экземпляров tblUsers объекта с прикрепленными tblUsermmRoles. Записи для обеих таблиц добавляются с сохранением внешних ключей.