如何直接从wcf调用直接更新实体?

问题描述:

这是我在我的WCF服务有如何直接从wcf调用直接更新实体?

public long Generic_Save(Product p, ObjectSet os) 
{ 
    if (p.Id == 0) 
    { 
     os.AddObject(p); 
    } 
    else 
    { 
     // UPDATE 
     Product original = os.Single<Project>(o => o.Id == p.Id); 

     original.Name = p.Name; 

     original.Items = p.Items; // doesn't work ! 
    } 

    dataEntities.SaveChanges(); 

    return p.Id; 
} 

Product p是从WCF调用一个对象,用的EntityKey等。但它不附加到当前dataEntities ..

我想要什么要做的是直接保存对象Product p,而不是从ObjectSet os之前得到原始值并修改值 - >Product original = os.Single<Project>(o => o.Id == p.Id);

我该怎么做?

[编辑]

我也尝试这种添加新的项目和它的工作

foreach (Item item in p.Items) 
{ 
    try 
    { 
     dataEntities.Items.ApplyCurrentValues(item); 
    } 
    catch (Exception) 
    { 
     Items i = new Items(); 

     // Set prop here or make a method CopyTo() 
     i.Prop = item.Prop; 

     dataEntities.AddToItems(i); 
    } 
} 
dataEntities.SaveChanges(); 

严重。只有Product p本身(update detached entity)才有可能,但是物品确实很难。问题是,您必须手动说出EF确切地说哪个项目发生了变化,哪些是新的,哪些已被删除。 the problem is here的讨论较长。常见的解决方案如下:

  • 完全按照您现在所做的操作,但不是分配项目,而是手动比较原始项目和接收项目,并相应地修改已加载的项目。如果您不在客户端添加或删除项目,则应该为每个项目调用ApplyCurrentValues
  • 使用Self tracking entitiesonly for .NET clients)。
+0

好吧,我会试试.. 如果我试图使ApplyCurrentValues所有项目,它应该工作? – baaron 2011-06-01 13:26:39

+0

如果您不添加新项目或删除客户端上的现有项目,那么它应该。 – 2011-06-01 13:33:25

+0

我在编辑部分发布答案 – baaron 2011-06-01 14:14:17