我正在使用'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)
}
答案 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>
希望其中一些有帮助