【问题标题】:EF Code First: Only set the foreign key(ID) and get a null collection of navigation propertyEF Code First:仅设置外键(ID)并获取导航属性的空集合
【发布时间】:2016-09-20 16:00:36
【问题描述】:

感谢您的回复,为了更清楚,我将我的问题重新组织如下:

 public class App
{
    [Key]
    public Guid Id { get; set; }

    public virtual IEnumerable<Build> Builds { get; set; }
}

public class Build
{
    [Key]
    public Guid Id { get; set; }

    public Guid AppId { get; set; }

    [ForeignKey("AppId")]
    public virtual App App { get; set; }
}


public class TestContext : DbContext
{
    public TestContext() : base("name=DefaultConnection")
    {
        Database.SetInitializer<TestContext>(new CreateDatabaseIfNotExists<TestContext>());
    }

    public DbSet<App> Apps { get; set; }
    public DbSet<Build> Builds { get; set; }
}

步骤 1> 保存数据

 class Program
{
    static void Main(string[] args)
    {
        using (TestContext context = new TestContext())
        {
            var id = Guid.NewGuid();
            App app = new App() { Id = id };
            Build build = new Build()
            {
                Id = Guid.NewGuid(),
                AppId = id
            };
            context.Apps.Add(app);
            context.Builds.Add(build);
            context.SaveChanges();;
        }

    }
}

步骤 2> 获取数据

class Program
{
    static void Main(string[] args)
    {
        using (TestContext context = new TestContext())
        {
            var builds = context.Apps.FirstOrDefault().Builds;
            Console.Read();
        }
    }
}

var builds 得到一个空值,当我检查数据库时,外键值保存得很好。

【问题讨论】:

  • 你的EF query 是什么?把那个代码也放上去。
  • 我不确定这是如何设置的。有没有理由让您的 Build 表由一个名为 App 的类表示?这只是一个错字吗?那么什么是 AppBuild?
  • 一个简单的查询>> app.Builds
  • @Ksib,不是错字,只是想测试一下,我已经更新了我的问题,现在更清楚了,谢谢
  • 老实说,我不确定您的第 1 步如何将任何内容保存到数据库中。应该是 context.App.Add(app); 在您的 .SaveChanges() 之前

标签: c# entity-framework code-first


【解决方案1】:

我的猜测是您正在使用即时加载,并且没有为该属性指定 Include()(可能),这看起来像

context.Apps.Where(...).Include(a => a.Builds).ToList()

或者你正在使用显式加载并且没有调用Load()(不太可能)。

【讨论】:

  • App app = new App(){ id = 1 ... };构建构建 = 新构建 { .. AppId = 1} var builds = app.Builds();并构建 = null;
  • 这不是查询。这只是构建对象图的代码。
【解决方案2】:

可能是你本地的 EF 没有用 App 的新集合刷新。您可能需要从数据库中刷新 App 对象。

How to Refresh DbContext

【讨论】:

  • 想知道是否只在 Build 对象中设置 AppId 属性有效?我已经重新启动了 VS servral 时间,仍然无法正常工作
  • 设置 AppBuild.AppId 然后将该对象持久化到数据库中应该允许您查询 App.Builds 属性。但是,关键是您需要将更改保存到数据库中,然后刷新数据。重新启动 Visual Studio 不会做任何事情。
猜你喜欢
  • 2017-06-26
  • 2014-01-20
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多