实体框架Child&父(列表属性)

时间:2013-09-18 07:52:42

标签: sql-server ajax vb.net web-services entity-framework-5

我正在开发一个包含EF5,Vb.net,AJAX(Javascript),ASMX-Webservices和HTML的项目。

我的问题是,如果我有(示例类):

Public Class Company

Public Property CompanyId As Integer

Public Property Name As String

Public Overridable Property Companytype As Companytype

End Class

和班级:

Public Class Companytype

Public Property CompanytypeId As Integer

Public Property Name As String

-> Public Overridable Property Companies As List(Of Company)

End Class

我需要 - >标记线?

我很害怕,但我真的不知道这条线给我带来了哪些进展。 实际上,我可以阅读所有类似公司类型的公司:

Public Shared Function PostCompanyTypeCompanies() As List(Of Company)
    Dim db As New Context
    Dim x As Integer = 1
    Dim y = (From c In db.Companies Where c.CompanyType.CompanyTypeId = x Select New With _
                                                                                 {c.Name, _
                                                                                  c.CompanyType})
    Dim z As List(Of Company) = y.AsEnumerable() _
                                .Select(Function(t) New Company With _
                                    {.Name = t.Name, _
                                     .CompanyType = t.CompanyType}).ToList()
    Return z
End Function

这与'x'只是一个例子,我可以将CompanytypeId传递给函数。 列表的问题是,当我想要获得新公司的Companytypes并且我无法访问公司的公司类型时,我总是得到循环引用:

 Company.Companytype.Name

当我没有列表时,一切正常,因为我可以将整个Companytpe存储到公司。

我尝试了另一种可能性,设置了儿童的吸气器。父属性受保护然后问题在逻辑上也是我无法访问变量,因为我描述了上面的3行。

所以重要的问题是:这是 - >列出属性是否必须?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

do I need the -> marked line?没有。它是冗余信息(没有实际用途),可能会引起一致性错误。例如:

Dim company1 As New Company()
Dim listCompanies As New List(Of Company)()

Dim companiesType1 As New Companytype()
listCompanies.Add(company1)

With companiesType1
    .CompanytypeId = 1
    .Name = "Type 1"
    .Companies = listCompanies
End With

With company1
    .CompanyId = 1
    .Name = "1"
    .Companytype = companiesType1
End With

上面的代码定义了Company1和相关的类型(companiesType1 ...虽然我们有“首先是鸡蛋或鸡肉”的问题,但是首先想到了为什么选择的方法是错误的)。如果您创建一个相同类型的新公司:

Dim company2 As New Company()
With company2
    .CompanyId = 2
    .Name = "2"
    .Companytype = companiesType1
End With

您必须重新定义companiesType1(更新其Companies属性),以保持一致性。但是,就这是多余的信息而言,Companytype将根据这一事实“独立完成”:

If (company2.Companytype Is company1.Companytype) Then
    'Both companies have the same type
End If

上述条件始终为真:如果companiesType1包含正确的信息(已使用company2更新),或者不是。

如果您需要列出属于某种类型的所有公司,您最好依赖存储所有值的其他类(例如allTheCompanies)。