代码之家  ›  专栏  ›  技术社区  ›  Gary McGill

如何在EF中使用/保持POCO对象关系?

  •  2
  • Gary McGill  · 技术社区  · 12 年前

    我有一些POCO对象,看起来像这样:

    public class Foo
    {
        public int Id { get; set; }
        public string FooProperty { get; set; }
        public int BarId { get; set; }
        public virtual Bar Bar { get; set; }
    }
    public class Bar
    {
        public int Id { get; set; }
        public string BarProperty { get; set; }
        public int FooId { get; set; }
        public virtual Foo Foo { get; set; }
    }
    

    每个Foo对象只有一个Bar(反之亦然)。

    现在我想创建一对新的Foo/Bar对象。所以我这样做(这就是我怀疑我错了的地方):

    var foo = new Foo() { FooProperty = "hello" };
    
    dbContext.Foos.Add(foo);
    
    var bar = new Bar() { BarProperty = "world" };
    
    foo.Bar = bar;
    
    dbContext.SaveChanges();
    

    正如你可能知道的,我希望是因为我“添加”了 foo 然后 bar 也会被添加,因为它是同一对象图的一部分,但不是:它没有被添加 FooId Bar 在调用后更新的对象 SaveChanges (尽管 Id Foo对象的 更新)。

    所以,我的猜测是,这种行为是因为我处理的是POCO,而不是EF代理对象,所以没有“管道”来实现这一点。我可以去拿 身份证 来自 Foo 对象并手动将其隐藏在 酒吧 对象(反之亦然),并对 保存更改 ,但显然这不是正确的做法。

    所以,大概我需要创建EF代理对象,而不是裸POCO对象。最好的方法是什么?

    1 回复  |  直到 12 年前
        1
  •  3
  •   Mark Oreta    12 年前

    如果实体满足创建代理对象的要求,则可以通过从上下文本身调用create函数来实现这一点:

        var foo = dbContext.Foos.Create();
        dbContext.Foos.Add(foo);
        var bar = dbContext.Bars.Create();
        foo.Bar = bar;
        dbContext.SaveChanges();