0

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

在更新的情况下,我看到“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)
}
4

1 回答 1

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>

希望有些帮助

于 2012-09-21T01:27:02.797 回答