根据EF子关系填充下拉列表

时间:2015-03-11 06:45:35

标签: c# vb.net entity-framework

我是第一次使用EF编写一个简单的应用程序。 (EF6)

我的数据库有几个表,它们之间有外键关系。该应用程序将为每个表格提供简单的显示,添加,更新,删除功能。

实体类是使用多对一关系构建的。

表'汽车'CarID所有者ID ColorID制作模型

表'所有者'所有者ID Fname Lname

表'颜色'ColorID ColorName

在汽车管理页面上 - 所有者和颜色表应该表示为下拉列表。

注意 - 这是一个webforms应用程序。

我从后面的代码调用我的'GetCar'函数并传递CarID。

这是我的功能,它可以工作,但我无法访问所有者属性。

Public Shared Function getCarByID(CarID As Integer) As Car
        Using db As MyAppContext = New MyAppContext
            Dim car As New Car
            car = db.Cars.First(Function(x) x.CarID = CarID)
            Return car
        End Using
End Function

所以我的问题是: 1:如何填充“所有者”下拉列表,我假设我需要编写一个单独的函数来返回一个List of Owners对象,对吗?

2:如何访问与汽车相关联的所有者的属性?

我尝试这样做之一(来自代码后面的aspx):

Dim car As Car = New Car
    car = Car.getCarByID(CarID)
    Me.lblOwnerFirstName.Text = car.Owner.Fname
输入car.owner时,

Intellisense会显示所有者属性。

我可以毫无问题地检索所有'汽车'属性。

ObjectContext实例已被释放,不能再用于需要连接的操作。

我也尝试将using块移动到后面的代码中进行测试并在那里设置Me.lblOwnerFirstName.Text = car.Owner.Fname,但是同样的错误。

任何评论或帮助表示赞赏,谢谢,

1 个答案:

答案 0 :(得分:1)

通常,Entity框架使用Lazy加载方法来加载数据。这意味着它只加载查询中询问的数据。在您的情况下,Entity框架已返回Car对象,然后在using语句的末尾处理您的上下文对象。因此,如果您尝试从汽车中访问所有者,则会抛出错误。要解决这个问题,您需要告诉实体框架像这样包含所有者与汽车。

Public Shared Function getCarByID(CarID As Integer) As Car
        Using db As MyAppContext = New MyAppContext
            Dim car As New Car
            car = db.Cars.Include("Owner").First(Function(x) x.CarID = CarID)
            Return car
        End Using
End Function

这也将返回所有者以及Car对象。