我有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类.
您需要将.Include方法添加到查询中.
var _db = new MyDBEntities(); var product = (from p in _db.Product.Include("Company") where p.ProductID == 3 select p).First();
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