2016-08-10 4 views
1

У меня есть следующие СущностиEntity Framework ленивая загрузка не работает в 1 .. * однонаправленная связь

public class A 
{ 
    public int AId {get; set;} 
} 

public class B 
{ 
    public int BId {get; set;} 
    public virtual A Child1 {get; set;} 
    public virtual A Child2 {get; set;} 
} 

со следующей конфигурацией

modelBuilder.Entity<B>() 
      .HasRequired(x => x.Child1) 
      .WithMany() 
      .Map(x => x.MapKey("Child1Id")) 

modelBuilder.Entity<B>() 
      .HasRequired(x => x.Child2) 
      .WithMany() 
      .Map(x => x.MapKey("Child2Id")) 

По какой-то причине Entity Framework не ленивым нагружают Child1 или Child2 при запросе объекта объекта B. Это

var b1 = context.Bs.FirstOrDefault(); 
Assert.IsNull(b.Child1) // true 
Assert.IsNull(b.Child2) // true 

но оно работает с, если я эксцессуально загружаю их.

var b2 = context.Bs.Include(x => x.Child1).Include(x => x.Child2).FirstOrDefault(); 
Assert.NotNull(b2.Child1) // true 
Assert.NotNull(b2.Child2) // true 

Кто-нибудь знает, почему свойства не становятся ленивыми?

EDIT

Кажется, что

context.Bs.FirstOrDefault() 

возвращает сам объект, а не тип прокси. Это указывает на то, что свойство ProxyCreationEnabled является ложным, но я дважды проверил его и установил значение true.

EDIT 2

Ok, наконец, нашли проблему. Я установил конструктор Bs в private, что, конечно, не позволяет расширить объект с помощью прокси-класса. И, следовательно, свойства навигации, где установлено значение null.

+0

Они были ленивы загружено ...... потому, что они не существуют (ленивая часть) –

+0

Прочитайте эту прекрасную статью по [погрузочным сущностям из MSDN] (https://msdn.microsoft.com /en-gb/data/jj574232.aspx) –

+0

Нет свойств, он работает, если я явно включаю их в запрос. – olif

ответ

1

Я изменил ваш код, чтобы работать с ленивой загрузкой. просто скопируйте пасту, и все должно быть хорошо.

Проверьте b1 с помощью VS перед линией записи, вы увидите ленивые загруженные объекты и не пугаете имя длинной сущности, потому что я включил создание прокси.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Database.SetInitializer(new DropCreateDatabaseAlways<MyDbContext>()); 

     using (var myDbContext = new MyDbContext("DefaultConnection")) 
     { 
      var a1 = new A(); 
      var a2 = new A(); 

      var b1 = new B 
      { 
       Child1 = a1, 
       Child2 = a2 
      }; 

      myDbContext.Bs.Add(b1); 
      myDbContext.SaveChanges(); 
     } 

     using (var myDbContext = new MyDbContext("DefaultConnection")) 
     { 
      var b1 = myDbContext.Bs.FirstOrDefault(); 
      b1.ToString(); 
      Console.WriteLine(b1.ToString()); 
     } 
    } 

    public class A 
    { 
     public int AId { get; set; } 
    } 

    public class B 
    { 
     public int BId { get; set; } 
     public virtual A Child1 { get; set; } 
     public virtual A Child2 { get; set; } 
    } 

    public class MyDbContext : DbContext 
    { 
     public DbSet<A> As { get; set; } 
     public DbSet<B> Bs { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<B>() 
       .HasRequired(x => x.Child1) 
       .WithMany() 
       .Map(x => x.MapKey("Child1Id")).WillCascadeOnDelete(false); 

      modelBuilder.Entity<B>() 
       .HasRequired(x => x.Child2) 
       .WithMany() 
       .Map(x => x.MapKey("Child2Id")).WillCascadeOnDelete(false); 

      base.OnModelCreating(modelBuilder); 
     } 

     public MyDbContext(string connectionString) 
      : base("name=" + connectionString) 
     { 
      this.Configuration.LazyLoadingEnabled = true; 
      this.Configuration.ProxyCreationEnabled = true; 
     } 
    } 
} 
+0

Я попробую, как только Visual Studio будет обновлен .. но не ProxyCreationEnabled true по умолчанию? – olif

+0

Да, правильно, 100% Я просто добавил, чтобы убедиться, что вы не отключили прокси-сервер где-нибудь, если вы установите ProxyCreationEnabled = false, этот apporach не будет работать –

+0

Это странно, потому что ваш пример отлично работает, но мой код не работает, и я не могу найти никаких различий в любом месте. Продолжает исследовать это позже на этой неделе. – olif

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