2012-09-20 36 views
0

我正在使用'wcf數據服務工具包'進行CURD操作。 獲取/添加/刪除工作正常,但更新失敗。更新無法在wcf dataservice工具包中工作

在更新的情況下,我看到'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 = "[email protected]"; 
    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("[email protected]", updated.UserEmailAddress) 
} 

回答

0

如果您使用的是WCF DataService的工具,你將需要實現ODataService爲您服務。

ODataService繼承自DataService併爲您提供我正在嘗試實現的自定義。

我會冒險猜測你使用ODataService時遇到的問題實際上與你正在公開的實體有關。

該工具包對您如何設置課程有點挑剔。

確保您對用戶類指定的以下

[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> 

希望一些這有助於

+0

我更新我的模型代碼的問題。此外,日誌問題僅針對根網址,其餘服務工作爲獲取/添加/刪除(除更新)。 – NiTiN

+0

您的項目中是否包含工具包代碼?如果是這樣,在ODataContext文件中放置一個斷點。該文件包含一個名爲SaveChanges的方法,您將能夠看到它正在嘗試執行的操作。另外請確保您使用的是http://wcfdstoolkit.codeplex.com/SourceControl/network/Forks/Airslash/SeptemberRelease這個版本的代碼,因爲這裏有幾個修正。 – SCB

+0

我正在使用nuget包。將嘗試代碼並讓你知道,謝謝! – NiTiN