实体框架7自引用表返回null

时间:2016-04-19 14:55:02

标签: c# sql-server entity-framework asp.net-core-mvc self-referencing-table

我正在使用EF 7(beta6-13679),在MVC 6 Web应用程序中(由于需要AD集成,只有dnx 4.5.1),数据库第一种方法并且无法获得自引用表以返回值正确地,我在运行我的应用程序时总是得到null,但LINQPad找到并与父/子一起工作就好了。想知道我是否有错误,或者这可能是新EF中的一个错误。希望有人可以复制问题,或者更好,解决问题。 :)对于无法嵌入图像的道歉,我还不允许。

以下是模型:

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 个答案:

答案 0 :(得分:0)

可能是因为LinqPad正在使用Linq to SQL,这是它在创建连接时使用的默认数据上下文。如果你想在LinqPad中使用EF 7,你需要下载它的驱动程序:

步骤

  1. 转到添加连接
  2. 点击查看更多驱动程序... 按钮 enter image description here
  3. 安装EF 7驱动程序(最适合LINQPad 5.06或更高版本)
  4. 使用它建立与数据库的连接。
  5. 现在,正如@bazz指出的那样,EF7不支持延迟加载,因此您必须通过Include方法使用预先加载来加载这些相关实体作为查询的一部分:

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