只是外键,我相信这个问题已经被问过,所以我提前道歉,但我不知道正确的关键字在我的搜索,包括保存引用属性...与实体框架
我无法理解当其中一个属性是断开环境中其他属性(如网站)的集合时更新(或甚至插入)对象的正确模式。我的问题与Web应用程序仅返回id的集合而不是完整对象的想法有关。我认为解释这个最好的方法是使用代码片段。
鉴于以下对象
Public Class User
Public Property UserId As Integer
Public Property Username As String
Public Property Roles As ICollection(Of Role)
End Class
Public Class Role
Public Property RoleId As Integer
Public Property RoleName As String
Public Property Users As ICollection(OF User)
End Class
Public Class EFDbContext
Inherits Entity.DbContext
Public Property Users As Entity.DbSet(Of User)
Public Property Roles As Entity.DbSet(Of Role)
End Class
数据库与3个表创建 - 用户,角色和RoleUsers。
我知道我可以很容易做到以下
Dim db = New EFDbContext()
Dim r1 = New Role() With { .RoleName = "User" }
Dim r2 = New Role() With { .RoleName = "Admin" }
db.Roles.Add(r1)
db.Roles.Add(r2)
Dim u1 = New User() With { .UserName = "test1", .Roles = New List(Of Role) }
u1.Roles.Add(r1)
db.Users.Add(u1)
db.SaveChanges()
它将两个新角色保存到数据库中(分别给他们的1和2的角色ID值),新用户(给它一个用户ID值1)和一个RoleId 1和UserId 1的新角色 - 用户条目。
但是,当处理像网站这样的断开连接的情况时,大多数人会有一个View Model来表示来自用户的输入,映射回实体。另外,对于表示角色的值,返回的数据很可能只包含代表角色的唯一键。例如,
Public Class UpdatedUserViewModel
Public Property UserId As Integer
Public Property Username As String
Public Property RoleIds As ICollection(Of Integer)
End Class
...
...
Dim userEntity = db.Users.Find(user.Values.UserId)
AutoMapper.Mapper.Map(userValues, userEntity)
因此,尽管userEntity.Roles集合可以包含单个项目,映射器可能只是添加像
ForMember(Function(u) u.Roles, Sub(m) m.MapFrom(Function(su) su.RoleIds.Select(Function(r) New Role() With {.RoleId = r})))
现在我们来到了问题,当有东西进入调用SaveChanges()
方法时,由于.RoleName属性为Nothing,EF会引发验证错误。
这种情况如何处理?我们是否应该手动循环访问角色并从数据库中获取每个角色?我们不能使用绘图工具吗?我是否为“缺失”属性提供伪造值,然后循环并将它们标记为“未更改”?
我知道这是很长,但我认为穿行会有帮助......
感谢。
我第一次看到基本的EF代码。 –
第一个代码是4.1及以上。 –