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

EF Code First: Only set the foreign key(ID) and get a null collection of navigation property

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

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

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

How to Refresh DbContext

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

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

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