为什么简单的实体数据模型关系返回null而不是对象的引用?

Sen*_*ful 7 .net entity-framework

我有2个简单的表和SQL Server Express中定义的外键:


产品

  • ProductID [auto-inc]
  • 名称
  • CompanyID [not-null]

公司

  • CompanyID [auto-inc]
  • 名称

FK_Product_Company

  • Product.CompanyID = Company.CompanyID

我创建了一个ADO.NET实体数据模型并将所有表添加到其中..edmx文件显示设计器中的1对多关系.我用数据手动填充数据库,以确保每个产品都有公司.但是,每当我尝试访问产品的公司时,它总是返回null而不是公司的实例.

例如,在C#中运行以下代码,返回null:

var _db = new MyDBEntities();
var product = (from p in _db.Product
               where p.ProductID == 3
               select p).First();
product.Company // == null
Run Code Online (Sandbox Code Playgroud)

我有什么步骤可以让它工作吗?

谢谢


我尝试过的事情:


运行以下SQL,正确返回公司记录.

SELECT Company.*
FROM Product
  LEFT JOIN Company ON (Product.CompanyID = Company.CompanyID)
WHERE Product.ProductID = 3
Run Code Online (Sandbox Code Playgroud)

我要做的下一件事就是调试这个问题,就是运行以下代码:

var _db = new MyDBEntities();
var product = (from p in _db.Product
               where p.ProductID == 3
               select p).First();
var company = (from c in _db.Company
               where c.CompanyID == product.CompanyID
               select c).First();
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译,因为ORM生成器隐藏了字段Product.CompanyID,我在设计器中看不到添加它的选项.


我想下一个最好的事情是以下,它确实返回了一家公司:

var _db = new MyDBEntities();
var company = (from c in _db.Company
               where c.CompanyID == 2
               select c).First();
Run Code Online (Sandbox Code Playgroud)

需要说明的是,ID为3的产品对应ID为2的公司.


我尝试使用LINQ to SQL Classes创建完全相同的关系,它工作正常.

当然,我没有使用DB Entities类,而是使用Data Context类.

小智 11

您需要将.Include方法添加到查询中.

var _db = new MyDBEntities();
var product = (from p in _db.Product.Include("Company")
               where p.ProductID == 3
               select p).First();
Run Code Online (Sandbox Code Playgroud)


Oli*_*ier 6

Entity框架支持深度加载,但延迟加载不是(Entity framework 2.0中将支持延迟加载).

使用Load()或.Include("Company")就像之前的帖子一样说它会起作用.

以下是如何使实体框架变得懒惰:http: //blogs.msdn.com/jkowalski/archive/2008/05/12/transparent-lazy-loading-for-entity-framework-part-1.aspx