2015-08-25 5 views
0

Это мой первый раз с использованием EF. Таким образом, я, возможно, пропустил что-то простое, что предотвращает ленивую загрузку моего BClass. Когда я загружаю AClass, свойство «B» равно null. Я бы ожидал, что он будет заселен, как сохранится.Entity Framework 6 - ленивая загрузка не работает

В моем примере у меня есть два простых классов:

public class AClass 
{ 
    public AClass() 
    { 
     Id = Guid.NewGuid(); 
     B = new BClass(); 
    } 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public virtual BClass B { get; set; } 
} 

public class BClass 
{ 
    public BClass() 
    { 
     Id = Guid.NewGuid(); 
    } 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public Guid Id { get; set; } 
    public string Description { get; set; } 
} 

В классе 'Контекст':

public DbSet<AClass> AClasses { get; set; } 
public DbSet<BClass> BClasses { get; set; } 

Ниже приведен простой тест. Я ожидал, что x.B будет загружен. Вместо этого он равен нулю?

using (var db = new TestContext()) 
{ 
    AClass a = new AClass(); 
    a.Name = "AClass"; 
    a.B.Description = "BClass Description Goes Here!"; 
    db.AClasses.Add(a); 
    db.SaveChanges(); // Works. Confirmed both a and a.B are persisted to the database 
} 

using (var db = new TestContext()) 
{ 
    AClass x = db.AClasses.Where(a => a.Name == "AClass").FirstOrDefault(); 
    System.Console.WriteLine(x.Name); 
    System.Console.WriteLine(x.B.Description); // x.B is null. Expected it to load and the .Description property to be "BClass Description Goes Here!" 
} 

Изменения были сохранены в базе данных правильно. Я еще не могу опубликовать снимок экрана.

Из AClass таблицы:

 
Id Name B_Id 
B7937E1B-9CC0-4318-B179-0D54B23B6CDA AClass 560D066B-4848-454D-B92C-F6AE4232057E 

Из BClass таблицы:

 
Id Description 
560D066B-4848-454D-B92C-F6AE4232057E BClass Description Goes Here! 

Entity Framework Version: 6.0.0.0

+0

Он будет работать только в том случае, если объект объекта привязан к некоторому экземпляру TestContext, когда первый оператор использования выполнен с использованием контекста, удаляется объект, и ваш ленивый запрос на загрузку не может быть выполнен. –

+0

Так как же я получу ленивую загрузку для работы во втором использовании заявления? – 360code

+0

Вы можете использовать один оператор using для этих запросов –

ответ

1

Удалить B инициализации класс формы AClass:

public AClass() 
{ 
    Id = Guid.NewGuid(); 
    //B = new BClass(); 
} 

Инициализация заставляет инфраструктуру сущности считать, что вы присвоили новое значение свойству B AClass и не назначили его прокси.

+1

Пояснение: http://stackoverflow.com/q/20757594/861716 –

Смежные вопросы