更新不在wcf dataservice工具包中工作

时间:2012-09-20 20:26:58

标签: wcf-data-services odata

我正在使用'wcf数据服务工具包'进行CURD操作。 获取/添加/删除工作正常,但更新失败。

如果是Update,我会看到调用'GetOne()'方法,但不会调用Save()。

服务代码:

public class UserService : ODataService<UserContext>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}

存储库代码:

public User GetOne(string id)
{
    return _session.Query<User>().Where(a => a.Id == int.Parse(id)).SingleOrDefault();
}
public void Save(User u)
{
    _session.Store(u);
    _session.SaveChanges();
}

数据上下文代码:

public class UserContext : ODataContext
{
    public IQueryable<User> Users
    {
        get { return base.CreateQuery<User>(); }
    }

    public override object RepositoryFor(string fullTypeName)
    {
        return new UserRepository();
    }
}

型号代码:

[DataServiceKey("Id")]
public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string UserEmailAddress { get; set; }
}

这是我的测试用例:

[TestMethod]
public void TestUpdateUser()
{
    var context = new UserService.UserContext(new Uri("http://localhost:59050/UserService.svc"));
    var user = context.Users.Where(a => a.Id == 385).SingleOrDefault();
    user.UserEmailAddress = "updated@email.com";
    context.UpdateObject(user);
    context.SaveChanges();  

    var context2 = new UserService.UserContext(new Uri("http://localhost:59050/UserService.svc"));
    var updated = context.Users.Where(a => a.Id == 385).SingleOrDefault();
    Assert.AreEqual("updated@email.com", updated.UserEmailAddress)
}

1 个答案:

答案 0 :(得分:0)

如果您使用的是WCF Dataservice工具包,则需要为您的服务实施ODataService。

ODataService继承自DataService,并为您提供我猜测您正在尝试实现的自定义。

我猜想你使用ODataService时遇到的问题实际上在于你所暴露的实体。

该工具包对于如何设置课程有点挑剔。

确保您在User类中指定了以下内容

[DataServiceKey("Id")]

其中Id是实体的密钥。

也应该初始化任何对象/集合,如果是外来属性,则使用属性标记它。

[ForeignProperty()]

我还会设置登录服务,这将帮助您进一步调试问题

<system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="10000" maxSizeOfMessageToLog="99140000" />
    </diagnostics>
</system.serviceModel>

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information,ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="Log" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="MessageLog" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="Log" initializeData="{path to log}" type="{wcf listener}" />
      <add name="MessageLog" initializeData="{path to log}" type="{wcf listener}" />
    </sharedListeners>
    <trace autoflush="true" />

  </system.diagnostics>

希望其中一些有帮助