3

我目前正在使用来自 C#(一个 asp.net mvc4 应用程序)的 WCF 数据服务来使用来自 Sharepoint 2010 的信息。

使用常规 Sharepoint 列出项目时,将更改保存到上下文时,新项目的 id 会自动填充到原始对象上。意义:

SomeContext context = /* creation of the context*/;
var someEntity = new SomeEntity {...};
context.AddToSomeEntityItems(someEntity);
context.SaveChanges();
var newId = someEntity.Id;      //this will have the new id

但是,如果您正在创建的是文档库的项目,则 id 似乎不会在已保存的实体上更新。例如:

SomeContext context = /* creation of the context*/;
var someOtherEntity = new SomeOtherEntity {...};
Stream data = /* some stream*/;
context.AddToSomeOtherEntityItems(someOtherEntity);
context.SetSaveStream(someOtherEntity, data, true, "SomeMIMEType", "SomeSlugPath");
context.SaveChanges();
var newId = someOtherEntity.Id;         //this will instead always have 0

我最初认为这是 WCF 数据服务的第一个版本中的一个错误,所以我更新到最新版本5.4.0。但行为似乎是相同的。

我宁愿避免在重负载期间最终可能失败的奇怪查找,例如.OrderByDescending(x => x.Id).First()用于获取最近创建的项目。

当使用 Fiddler 查看实际的网络流量时,我可以看到二进制数据的初始上传实际上确实返回了项目的信息及其 ID。如果我在保存更改之前使用SetLink配置与该项目的其他关系,它们会正确链接,因此上下文会相应地处理该值。

当项目用于文档库时,有什么方法可以让 WCF 数据服务更新实体上的 ID?

4

2 回答 2

2

通常,我在插入之前手动设置 Id

someOtherEntity.Id = Guid.NewGuid();

这样,您也可以更轻松地进行 TDD。我认为最好将责任留给您的代码,而不是依靠外部存储系统来告诉您 ID 是什么。

于 2013-06-12T23:56:26.353 回答
2

我正在做的是从响应标头中解析出 id:

var responses = context.SaveChanges();
var created = responses.FirstOrDefault(r => r.StatusCode == (int)HttpStatusCode.Created);

if (response != null)
{
    var location = response.Headers.First(h => h.Key == "Location").Value;
    //location will be http://sharepoint.url/site/_vti_bin/ListData.svc/{listname}(id)
    //you can parse out the id from the end of that string
}

它并不完全优雅,但它确实有效。

于 2013-07-10T20:55:39.343 回答