首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EF4中代码优先集合是不是懒加载?

在EF4中代码优先集合是不是懒加载?
EN

Stack Overflow用户
提问于 2010-08-16 18:09:45
回答 2查看 2.6K关注 0票数 4

使用Microsoft Visual C# 2010Express,实体框架功能CTP4。

我先用基于Scott Gu's blog的小工具用代码尝试了EF4。但似乎在检索实体时,集合并未初始化。在将产品添加到类别时,我得到一个空引用异常。在我见过的所有示例中,集合从未显式初始化过。我遗漏了什么?

下面是我的代码:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var _db = new Northwind();

            var c = new Category { CategoryName = "Testcat" };
            _db.Categories.Add(c);
            _db.SaveChanges();

            var c2 = _db.Categories.SingleOrDefault(i => i.CategoryId==c.CategoryId);
            var pr = new Product { ProductName = "testprod" };

            c2.Products.Add(pr);    //  <---  Null reference for Products

            _db.SaveChanges();

            Console.WriteLine("Done...");

            Console.ReadKey();
        }
    }

    public class Product
    {
        public int ProductId { get; set; }
        public string ProductName { get; set; }
        public virtual Category Category { get; set; }
    }

    public class Category
    {
        public int CategoryId { get; set; }
        public string CategoryName { get; set; }
        public virtual ICollection<Product> Products { get; set; }
    }

    public class Northwind : DbContext
    {
        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-18 21:59:25

延迟加载不适用于POCOs。你需要一个代理。你可以通过替换以下代码来获得它

代码语言:javascript
复制
var c = new Category { CategoryName = "Testcat" };

使用

代码语言:javascript
复制
var c = _db.Categories.Create();
c.CategoryName = "Testcat";

您另一种选择仍然是使用不带代理的POCO,并自己创建此列表并替换

代码语言:javascript
复制
c2.Products.Add(pr);

使用

代码语言:javascript
复制
c2.Products = new List<Product> { pr };
票数 0
EN

Stack Overflow用户

发布于 2010-08-17 01:49:30

正如Yury Tarabanko的评论所说,返回的类别是空的,因为你没有c的类别id,因为它还没有被分配。

代码语言:javascript
复制
var c2 = _db.Categories.SingleOrDefault(i => i.CategoryName == c.CategoryName);
var pr = new Product { ProductName = "testprod" };

c2.Products.Add(pr); 

由于您将c.CategoryName的值赋给了"Testcat“,因此可以正常工作。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3492192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档