0

我正在使用 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

我需要 -> 标记线吗?

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

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 时,我总是会得到一个循环引用,例如:

 Company.Companytype.Name

当我在没有清单的情况下执行此操作时,一切正常,因为我可以将整个 Companytpe 存储到公司。

我尝试了另一种可能性,将子属性和父属性的 Getter 设置为 Protected,然后问题在逻辑上也是我无法访问该变量,因为我在上面描述了 3 行。

所以重要的问题是:这 -> 列表属性是强制性的吗?

谢谢你的帮助。

4

1 回答 1

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)。

于 2013-09-18T10:16:14.397 回答