2

Я использую EF 7 (beta6-13679) в веб-приложении MVC 6 (только dnx 4.5.1 из-за необходимости интеграции с AD), с базовым подходом базы данных и не может получить таблицу саморекламы, чтобы вернуть значение правильно, я всегда получаю null при запуске моего приложения, однако LINQPad находит и работает с родительским/детьми просто отлично. Удивление, возможно, у меня что-то не так, или, может быть, это ошибка в новом EF. Надеясь, что кто-то может дублировать проблему или, еще лучше, решить ее. :) Извинения за невозможность вставить изображения, пока не позволяют.Entity Framework 7 self referencing table return null

Вот модель:

public partial class Directories 
{ 
    public Directories() 
    { 
     Directory_ACL_Entries = new HashSet<Directory_ACL_Entries>(); 
     Files = new HashSet<Files>(); 
    } 

    public long Directory_ID { get; set; } 
    public DateTime Created { get; set; } 
    public DateTime Discovery_TS { get; set; } 
    public string Hash { get; set; } 
    public bool Hidden { get; set; } 
    public long? Parent_Directory_ID { get; set; } 
    public string Path { get; set; } 

    public virtual ICollection<Directory_ACL_Entries> Directory_ACL_Entries { get; set; } 
    public virtual ICollection<Files> Files { get; set; } 
    public virtual Directories Parent_Directory { get; set; } 
    public virtual ICollection<Directories> InverseParent_Directory { get; set; } 
} 

Вот EF беглый код:

modelBuilder.Entity<Directories>(entity => 
     { 
      entity.HasKey(e => e.Directory_ID); 

      entity.HasIndex(e => e.Hash).HasName("UK_Directories").IsUnique(); 

      entity.Property(e => e.Created).HasColumnType("datetime"); 

      entity.Property(e => e.Discovery_TS).HasColumnType("datetime"); 

      entity.Property(e => e.Hash) 
       .IsRequired() 
       .HasMaxLength(50); 

      entity.Property(e => e.Path).IsRequired(); 

      entity.HasOne(d => d.Parent_Directory).WithMany(p => p.InverseParent_Directory).HasForeignKey(d => d.Parent_Directory_ID); 
     }); 

Это был сгенерирован автоматически с помощью перепроектируете подмости с помощью следующей команды:

dnx ef dbcontext scaffold "Server=serverName\SQLEXPRESS;Database=dbName;Trusted_Connection=True;" EntityFramework.MicrosoftSqlServer --outputDir Models 

LINQPad показывает родительское значение, возвращаемое правильно: LINQPad showing parent and children

Visual Studio Возвращение Null: VS returning null

+1

Глядя [this] (https://github.com/aspnet/EntityFramework/issues/3312), похоже, что в EF7 не поддерживается ленивая загрузка. Вам нужно будет использовать метод Include(). – bazz

+0

Это действительно проблема. При желании загружать столбцы с самоначислением в следующем формате: .Include (table => table.selfReference) – ViOTeK

+0

обратите внимание на производительность! EF7 не очень оптимизирован. Я понижаю свой проект (от 7 rc1 до 6.3.1), потому что выступления очень плохие – Amine

ответ

0

Возможно потому, что LINQPad использует Linq для SQL, который является контекст данных по умолчанию, который он использует во время создания соединения. Если вы хотите использовать EF 7 в LINQPad вам нужно будет загрузить свой драйвер:

шаги

  1. Перейти к добавлять соединения
  2. Нажмите на Показать больше водителей ... кнопка enter image description here
  3. Установите драйвер EF 7 (лучше всего работает с LINQPad 5.06 или выше)
  4. Используйте его, чтобы установить соединение с вашей БД.

Теперь, как @bazz отметил, EF7 не поддерживает отложенную загрузку, поэтому вы должны использовать жадную загрузку, чтобы загрузить эти связанные объекты как часть вашего запроса с помощью метода Include:

var result=Directories.Include(d=>d.Children)...; 
+0

Спасибо. Как упоминает мой комментарий выше к @bazz, мне действительно нужно было с радостью загрузить столбцы с самонаблюдением. – ViOTeK