【问题标题】:Saving child entity via WCF using EntityFramework 4.1使用 EntityFramework 4.1 通过 WCF 保存子实体
【发布时间】:2011-08-08 03:41:39
【问题描述】:

假设我有一个 Person 和一个 Address 对象,其中 Person 有一个 Address 对象列表。该信息通过 WCF 服务公开,我正在尝试使用 EntityFramework 4.1。

如果我想更新 Person 上的 Address 对象,我想要一个名为 UpdateAddress(Address addr) 的 WCF 方法。

DBContext 似乎只有一个 Person 列表,其中 Person 对象中有一个 Address 列表。这是更新地址的唯一方法,因为它似乎意味着它需要加载所有人员以在保存之前找到要更新的地址,使其效率低下。

有没有办法只更新而不加载父实体?

【问题讨论】:

  • Address 对象应该有一个 PersonId 属性,不是吗?
  • 如果你只想更新一个特定的 Address 对象,你应该只将它传递给 WCF,并记住相应地设置它的 PersonId 属性
  • 我如何使用 EntityFramework 做到这一点?

标签: c# entity-framework-4 parent-child


【解决方案1】:

如果Person 是模型的一部分并且Person 具有Address 的集合,那么Address(作为相关实体)也是模型的一部分(除非您从模型中明确排除了地址集合)。这意味着您可以简单地将地址集作为辅助属性添加到 DbContext:

public class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

对于UpdateAdress,您可以使用:

public void UpdateAddress(Address addr)
{
    using (var context = new MyContext())
    {
        var addressInDb = context.Addresses.Find(addr.Id);
        context.Entry(addressInDb).CurrentValues.SetValues(addr);
        context.SaveChanges();
    }
}

即使您不想或不能将Addresses DbSet 添加到上下文中,您也可以使用上下文的Set&lt;T&gt;() 方法(只要T 是模型实体-并且Address 应该是一):

public void UpdateAddress(Address addr)
{
    using (var context = new MyContext())
    {
        var addressInDb = context.Set<Address>().Find(addr.Id);
        context.Entry(addressInDb).CurrentValues.SetValues(addr);
        context.SaveChanges();
    }
}

【讨论】:

  • 非常感谢!我首先编写代码并输入我自己的 DbContext 不知道我可以为地址添加另一个 DbSet 属性。关于使用 Set 的好提示——再次感谢!
猜你喜欢
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多