1

我正在使用 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 总是显示为“未更改”。

这段代码有什么问题吗?

4

5 回答 5

3

这可能是一个很长的镜头......但是:

我假设您的服务实际上在另一个层?如果您在同一层进行测试,您将遇到问题。

自跟踪实体 (STE) 在连接到 ObjectContext 之前不会记录更改,其想法是,如果它们连接到 ObjectContext,它可以为它们记录更改,并且重复执行相同的工作是没有意义的。

STE 在客户端上使用 WCF 反序列化后开始跟踪,即一旦将它们物化到没有 ObjectContext 的层。

如果您查看生成的代码,您应该能够看到如何手动打开跟踪。

希望这可以帮助

亚历克斯

于 2010-01-30T07:11:38.373 回答
1

您必须在客户端和服务之间与 STE 共享程序集——这是重点。然后在添加服务引用时确保选中“在引用的程序集中重用类型”。

原因是 STE 包含无法通过“添加服务引用”传输的逻辑,因此您必须共享这些类型才能在客户端也具有跟踪逻辑。

于 2011-01-09T14:13:27.417 回答
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);
于 2010-02-01T22:51:40.973 回答
0

如果您使用没有 WCF 的 STE,您可能必须手动调用 StartTracking()。

于 2010-03-23T18:22:56.167 回答
0

我遇到了同样的问题并找到了解决方案。

看来,要让自跟踪实体自动开始跟踪,您需要在添加服务引用之前引用您的 STE 项目。

通过这种方式,Visual Studio 会生成一些 .datasource 文件来完成最后的技巧。

我在这里找到了解决方案:http: //blogs.u2u.be/diederik/post/2010/05/18/Self-Tracking-Entities-with-Validation-and-Tracking-State-Change-Notification.aspx

至于手动启动跟踪,客户端似乎没有这些方法。

希望能帮助到你...

于 2011-11-09T09:50:34.037 回答