EF 4自我跟踪实体无法按预期工作

时间:2010-01-30 01:14:35

标签: entity-framework self-tracking-entities

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

此代码中有什么问题吗?

5 个答案:

答案 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文件,这些文件可以完成最后一招。

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

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

希望它有所帮助...