我正在使用EF4自我追踪实体(VS2010 Beta 2 CTP 2加上新的T4发电机)。但是当我尝试更新实体信息时,它不会按预期更新到数据库。
我设置了2个服务电话。一个用于返回资源对象的GetResource(int id)。第二个调用是SaveResource(Resource res);这是代码。
public Resource GetResource(int id)
{
using (var dc = new MyEntities())
{
return dc.Resources.Where(d => d.ResourceId == id).SingleOrDefault();
}
}
public void SaveResource(Resource res)
{
using (var dc = new MyEntities())
{
dc.Resources.ApplyChanges(res);
dc.SaveChanges();
// Nothing save to database.
}
}
//Windows Console Client Calls
var res = service.GetResource(1);
res.Description = "New Change"; // Not updating...
service.SaveResource(res);
// does not change anything.
在我看来,ChangeTracker.State始终显示为“未更改”。
此代码中有什么问题吗?
答案 0 :(得分:3)
这可能是一个长镜头......但是:
我认为您的服务实际上在另一层?如果您在同一层进行测试,则会遇到问题。
自跟踪实体(STE)在连接到ObjectContext之前不会记录更改,其想法是如果它们连接到ObjectContext,它可以记录它们的更改,并且没有必要再做两次相同的工作
STE在使用WCF在客户端反序列化后开始跟踪,即一旦它们被实现为没有ObjectContext的层。
如果您查看生成的代码,您应该能够看到如何手动启用跟踪。
希望这有帮助
亚历
答案 1 :(得分:1)
您必须在客户端和服务之间与STE共享程序集 - 这是重点。然后,在添加服务引用时,请确保选中“在引用的程序集中重用类型”。
原因是STEs包含无法通过“添加服务引用”转移的逻辑,因此您必须共享这些类型以在客户端上具有跟踪逻辑。
答案 2 :(得分:0)
在阅读Daniel Simmons的以下提示后,STE开始跟踪。这是完整文章的链接。 http://msdn.microsoft.com/en-us/magazine/ee335715.aspx
确保在客户端上重复使用自我跟踪实体模板生成的实体代码。如果您使用在Visual Studio或其他工具中添加服务引用生成的代理代码,那么事情看起来是正确的大多数情况下,您会发现实体实际上并未跟踪客户端的更改。
因此在客户端中请确保您不使用添加服务引用来获取代理,而是通过以下代码访问服务。
var svc = new ChannelFactory<IMyService>("BasicHttpBinding_IMyService").CreateChannel();
var res = svc.GetResource(1);
答案 3 :(得分:0)
如果您使用没有WCF的STE,您可能需要手动调用StartTracking()。
答案 4 :(得分:0)
我遇到了同样的问题并找到了解决方案。
似乎自动跟踪实体自动开始跟踪,您需要在添加服务参考之前引用您的STE项目。
这样,Visual Studio会生成一些.datasource文件,这些文件可以完成最后一招。
至于手动启动跟踪,似乎您在客户端没有这些方法。
希望它有所帮助...