2

我在 MVC 6 Web 应用程序中使用 EF 7(beta6-13679)(由于需要 AD 集成,只有 dnx 4.5.1),采用数据库优先方法,无法获取自引用表以正确返回值,我运行我的应用程序时总是为空,但是 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 显示父和子

Visual Studio 返回空值: VS 返回空值

4

1 回答 1

0

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

脚步

  1. 去添加连接
  2. 单击查看更多驱动程序...按钮 在此处输入图像描述
  3. 安装 EF 7 驱动程序(最好与 LINQPad 5.06 或更高版本一起使用)
  4. 使用它来建立与您的数据库的连接。

现在,正如@bazz 指出的那样,EF7 不支持延迟加载,因此您必须使用预先加载通过Include方法来加载这些相关实体作为查询的一部分:

var result=Directories.Include(d=>d.Children)...;
于 2016-04-19T16:23:03.243 回答