如何直接从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 entities(only for .NET clients)。
好吧,我会试试.. 如果我试图使ApplyCurrentValues所有项目,它应该工作? – baaron 2011-06-01 13:26:39
如果您不添加新项目或删除客户端上的现有项目,那么它应该。 – 2011-06-01 13:33:25
我在编辑部分发布答案 – baaron 2011-06-01 14:14:17