当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么简单的实体数据模型关系返回null而不是对象的引用?》经验,为你挑选了2个好方法。

我有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

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

谢谢


我尝试过的事情:


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

SELECT Company.*
FROM Product
  LEFT JOIN Company ON (Product.CompanyID = Company.CompanyID)
WHERE Product.ProductID = 3

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

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();

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


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

var _db = new MyDBEntities();
var company = (from c in _db.Company
               where c.CompanyID == 2
               select c).First();

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


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

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



1> 小智..:

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

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



2> Olivier..:

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有