[asp.net-mvc]将一个表 ID 分配给另一个表 ID 像 Asp.Net 身份 AspNetUserRole

发布时间: 2017/3/25 0:50:52
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

嗨,我有 3 模型类安装程序Group

Public Class Group
    Public Property Id As Long
    Public Property Name As String
    Public Property CoverImgUrl As String
    Public Overridable ReadOnly Property Profile() As ICollection(Of Profile)
        Get

        End Get

    End Property
End Class

Profile

Public Class Profile
    Public Property Id As Long
    <Required>
    <MaxLength(20)>
    <Display(Name:="First Name")>
    Public Property FirstName As String
    <Required>
    <MaxLength(20)>
    <Display(Name:="Last Name")>
    Public Property LastName As String
 Public Overridable ReadOnly Property Group() As ICollection(Of Group)
        Get

        End Get

    End Property

GroupMembers

Public Class GroupMembers
    Public Sub New()
    End Sub
    Public Overridable Property Group() As Group
    Public Overridable Property GroupId() As String
    Public Overridable Property Profile() As Profile
    Public Overridable Property ProfileId() As String
End Class

我跑了 Update-Database 命令,更新我的数据库,并创建了一个表 ProfileGroup 像 asp.net AspNetUserRole

enter image description here

与进展为止如何可以我一将组分配到配置文件中创建像 asp.net 使用 UserManager.AddToRole 方法将用户分配给角色或任何全球最佳实践对此。谢谢你

解决方法 1:

它看起来像你只想设置之间的多对多关系 ProfileGroup 。然而,你会对它都错了。

第一,传统上,不要实际上定义了一个类为中介的表, GroupMembers 在这种情况下,除非您需要一个有效载荷,即额外数据的关系。在您发布的代码中,无负载上有关系,所以你只让你的生活更难通过这种方式。假设你想让事情,正如他们,不过,您需要设置您喜欢的类︰

Public Class Group
    ...

    Public Overridable Property Profiles As ICollection(Of GroupMember)

End Class

Public Class Profile
    ...

    Public Overridable Property Groups As ICollection(Of GroupMember)

End Class

Public Class GroupMember
    Public Property GroupId As String
    Public Overridable Property Group As Group

    Public Property ProfileId As String    
    Public Overridable Property Profile As Profile    
End Class

然后,这将是足够的实体框架来辨别的关系和与相应的外键创建相应的表。然而,你会被强迫访问 Profile / Group 间接,即 profile.Groups.First().Group 。而一个隐式联接表,你可以只做 profile.Groups.First()

所以,为了有一个隐式联接表,你将需要以下类︰

Public Class Group
    ...

    Public Overridable Property Profiles As ICollection(Of Profile)

End Class

Public Class Profile
    ...

    Public Overridable Property Groups As ICollection(Of Group)

End Class

请注意, GroupMember 类会彻底消失。实体框架将仍然认为这是多对多和创建一个表,最有可能命名为 dbo.GroupProfiles 。如果你不满意的表名称,您可以声明它使用流利的配置︰

modelBuilder.Entity(Of Profile)().
    HasMany(Function(t) t.Groups).
    WithMany(Function(t) t.Profiles).
    Map(Sub(m)
            m.ToTable("GroupMembers")
        End Sub)
官方微信
官方QQ群
31647020