Sen*_*ful 7 .net entity-framework
我有2个简单的表和SQL Server Express中定义的外键:
产品
公司
FK_Product_Company
我创建了一个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)
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
| 归档时间: |
|
| 查看次数: |
5843 次 |
| 最近记录: |