4

. 게으른 로딩하지? 마이크로 소프트 비주얼 C# 2010 익스프레스, 엔티티 프레임 워크 기능 CTP4를 사용

나는 Scott Gu's blog에 따라 작은 뭔가 첫 번째 코드와 EF4을 시도했다. 그러나 개체를 검색 할 때 컬렉션이 초기화되지 않은 것으로 보입니다. 범주에 제품을 추가 할 때 null 참조 예외가 발생합니다. 필자가 보았던 모든 예제에서 컬렉션은 명시 적으로 초기화되지 않습니다. 내가 뭘 놓치고 있니?

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; } 
    } 

} 
+1

는 최대한 멀리 볼 수있는 문제입니다 당신의 질의는'Category'에 대해 null을 반환 할 것이기 때문에'c2'는 null입니다. 자동 생성 된 아이디로 –

+0

DbContext지도 ID입니다. savechanges() 후에 Id가 채워진다. C2는 null이 아닙니다 (확인). 그러나 제품은 null입니다. –

+0

'_db.Categories.Include ("Products") 명시 적 로딩을 시도 할 수 있습니다. SingleOrDefault (...)'. –

답변

0

게으른 로딩 포항 강판 작동하지 않습니다 "Testcat"의 값을 c.CategoryName을 할당하기 때문에

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

c2.Products.Add(pr); 

작동합니다. 프록시가 필요합니다. 당신은 여전히 ​​프록시가없는 POCO를 사용하여이 목록을 직접 작성하고 귀하의 다른 옵션을 대체

var c = _db.Categories.Create(); 
c.CategoryName = "Testcat"; 

var c = new Category { CategoryName = "Testcat" }; 

를 교체하여 얻을 수

c2.Products.Add(pr); 

c2.Products = new List<Product> { pr }; 
+0

고마워, 나도 알아,하지만 지금은이 질문을 닫을 수 있습니다. –

-1

Yury Tarabanko 말한다,이 할당되지 않았기 때문에 당신이 C에 대한 카테고리 ID를 가지고 있지 않기 때문에 null로 반환되는 범주별로 주석으로 :

여기 내 코드입니다. 당신이

+0

Yuri에 대한 내 의견보기. SaveChanges() 후에 Id가 자동 생성되었습니다. –

관련 문제