0

CURD 操作に「wcf データ サービス ツールキット」を使用しています。取得/追加/削除は正常に機能しますが、更新は失敗します。

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)
}
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 に答える