【问题标题】:Getting ID of item after posting to a document library发布到文档库后获取项目 ID
【发布时间】:2013-07-11 04:55:39
【问题描述】:

我目前正在使用来自 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?

【问题讨论】:

  • 哇,我真的是唯一一个使用 WCF 数据服务处理数据流场景的人吗?
  • 在这种情况下,什么是有效的 slug 路径?当我尝试这样做时,我不断收到错误,但我没有得到任何有关导致错误的信息stackoverflow.com/questions/35523373/…

标签: c# sharepoint-2010 wcf-data-services odata


【解决方案1】:

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

someOtherEntity.Id = Guid.NewGuid();

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

【讨论】:

  • 这在这种情况下是行不通的。在这种情况下,数据由 Sharepoint 管理,Sharepoint 分配自己的 ID。另外,我无法更改当前的数据模型并将其打开以解决并发问题和重复 ID。当前的一个在所有其他情况下都可以完美地工作,除非涉及流,这就是为什么我正在寻找一种方法让它与自动 ID 和流一起工作。该行为可能表明它可能是 WCF 客户端或 Sharepoint 的服务器实现上的错误,但我没有找到任何表明这一点的信息。
【解决方案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
}

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

【讨论】:

  • 有趣的解决方法!如果数据服务团队中的某个人发现了错误和相关问题,我将保留这个问题。感谢您的解决方法。
  • 我已经看到了它应该起作用的各种方式,无论是使用首选项还是使用 SaveChanges 的包装器来做一些额外的事情,但除此之外没有什么对我有用。它可能感觉有点笨拙,但它应该与数据服务的工作方式一样可靠..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2020-12-04
相关资源
最近更新 更多