2011-08-07 44 views
0

說我有一個人和一個地址對象,其中一個人有一個地址對象列表。信息通過WCF服務公開,我試圖使用EntityFramework 4.1。使用EntityFramework通過WCF保存子實體4.1

如果我想更新Person上的Address對象,我想要一個名爲UpdateAddress(Address addr)的WCF方法。

DBContext似乎只有Person列表,其中Person對象中有一個Address列表。這是更新地址的唯一方法,因爲它似乎意味着它需要加載所有的人員才能在保存之前找到要更新的地址,使其效率低下。

有沒有一種方法可以在不加載父實體的情況下進行更新?

+0

的Addre ss對象應該有一個PersonId屬性,不是嗎? – sternr

+0

是的,它確實有一個PersonId – soundslike

+0

如果你只想更新一個特定的Address對象,那麼你只需要將它傳遞給WCF,並且記得相應地設置它的PersonId屬性 – sternr

回答

1

如果Person是模型的一部分,PersonAddress隨後還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<T>()方法(只要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(); 
    } 
} 
+0

完美謝謝!我先做代碼,輸入我自己的DbContext不知道我可以爲地址添加另一個DbSet屬性。好的提示也使用Set - 再次感謝! – soundslike