我目前正在使用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?
答案 0 :(得分:2)
通常,我在插入
之前手动设置IdsomeOtherEntity.Id = Guid.NewGuid();
这样你也可以更轻松地进行TDD。我认为最好将责任留给您的代码,而不是依赖外部存储系统来告诉您Id是什么。
答案 1 :(得分: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
}
它不是很优雅,但它确实有用。