EF Code First:只设置外键(ID)并获得导航属性的空集合

本文关键字:导航 属性 集合 空集 ID First Code 设置 EF | 更新日期: 2023-09-27 18:08:00

感谢您的回复,为了更明确,我重新整理了我的问题如下:

 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> Save Data

 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构建得到一个空值,而我检查数据库,外键值保存得很好

EF Code First:只设置外键(ID)并获得导航属性的空集合

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

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

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

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

如何刷新DbContext