oData SharePoint 添加包含值属性的列表项
oData SharePoint Add List Item Containing Value Properties
如何保存属于另一个 SharePoint 列表项的 "Value" 和 "DataServiceCollection" 对象?这些是我的模型中唯一没有保存的属性。
生成的 Food SharePoint 模型具有以下属性:
public class Food
{
DataServiceCollection<FoodIngredientValue> Ingredient;
FoodStateValue State;
string _StateValue
}
首先,我不知道为什么在SharePoint生成的模型中有两种添加状态值的方法。我尝试填充其中一个,但状态值未填充到 SharePoint 中。
其次,我尝试通过在保存之前将 FoodIngredientValue 对象硬编码到食品模型以及通过查询 SharePoint 并将它们分配给成分来填充成分集合 属性,但它没有保存在 SharePoint 中。
我使用下面的代码向 SharePoint 列表添加了一个新的食物项,并且我验证了所有三个属性都已填充到我的模型中,但其中 none 个被保存了。
public bool Insert(Food food)
{
var dataContext = new FoodDataContext(new Uri(EndpointUrl)) { Credentials = CredentialCache.DefaultNetworkCredentials };
dataContext.AddToFoods(food);
var response = dataContext.SaveChanges().FirstOrDefault();
return response.StatusCode == 201;
}
这是一篇很棒的博客post,解释了如何link SharePoint oData 中的复杂列表项(DataServiceCollecton 和值对象)API:
http://blog.heeresonline.com/2014/07/sharepoint-wcf-dataservices-choice-lookup-column-editing/
要记住的重要一点是,在开始填充类型为 DataServiceCollection 或 Value 对象的复杂字段之前,将新项添加到数据上下文中。对于 DataServiceCollection 类型的属性,需要做更多的工作才能正确 link 它们,以便将它们保存在数据上下文中,如下面的 Ingredient 所示。这是最终有效的代码示例:
var foodItem = new FoodItem();
dataContext.AddToFoods(foodItem); // Add to context before populating fields so the values are tracked.
foodItem = Mapper.Map(newFood, foodItem);
// DataValue Properties like StateValue objects can now be added since it is tracked by the context.
var state = StateValue.CreateStateValue("Montana");
foodItem.StateValue = state;
// Need to link special DataServiceCollection lists like Ingredient using a reference.
if (newFood.Ingredient != null)
{
newFood.Ingredient.ForEach(c =>
{
var ingredient = FoodIngredient.CreateFoodIngredientValue(c);
dataContext.AttachTo("FoodIngredientValue", ingredient);
foodItem.FoodIngredient.Add(ingredient);
dataContext.AddLink(foodItem, "FoodIngredient", ingredient);
});
}
如何保存属于另一个 SharePoint 列表项的 "Value" 和 "DataServiceCollection" 对象?这些是我的模型中唯一没有保存的属性。
生成的 Food SharePoint 模型具有以下属性:
public class Food
{
DataServiceCollection<FoodIngredientValue> Ingredient;
FoodStateValue State;
string _StateValue
}
首先,我不知道为什么在SharePoint生成的模型中有两种添加状态值的方法。我尝试填充其中一个,但状态值未填充到 SharePoint 中。
其次,我尝试通过在保存之前将 FoodIngredientValue 对象硬编码到食品模型以及通过查询 SharePoint 并将它们分配给成分来填充成分集合 属性,但它没有保存在 SharePoint 中。
我使用下面的代码向 SharePoint 列表添加了一个新的食物项,并且我验证了所有三个属性都已填充到我的模型中,但其中 none 个被保存了。
public bool Insert(Food food)
{
var dataContext = new FoodDataContext(new Uri(EndpointUrl)) { Credentials = CredentialCache.DefaultNetworkCredentials };
dataContext.AddToFoods(food);
var response = dataContext.SaveChanges().FirstOrDefault();
return response.StatusCode == 201;
}
这是一篇很棒的博客post,解释了如何link SharePoint oData 中的复杂列表项(DataServiceCollecton 和值对象)API:
http://blog.heeresonline.com/2014/07/sharepoint-wcf-dataservices-choice-lookup-column-editing/
要记住的重要一点是,在开始填充类型为 DataServiceCollection 或 Value 对象的复杂字段之前,将新项添加到数据上下文中。对于 DataServiceCollection 类型的属性,需要做更多的工作才能正确 link 它们,以便将它们保存在数据上下文中,如下面的 Ingredient 所示。这是最终有效的代码示例:
var foodItem = new FoodItem();
dataContext.AddToFoods(foodItem); // Add to context before populating fields so the values are tracked.
foodItem = Mapper.Map(newFood, foodItem);
// DataValue Properties like StateValue objects can now be added since it is tracked by the context.
var state = StateValue.CreateStateValue("Montana");
foodItem.StateValue = state;
// Need to link special DataServiceCollection lists like Ingredient using a reference.
if (newFood.Ingredient != null)
{
newFood.Ingredient.ForEach(c =>
{
var ingredient = FoodIngredient.CreateFoodIngredientValue(c);
dataContext.AttachTo("FoodIngredientValue", ingredient);
foodItem.FoodIngredient.Add(ingredient);
dataContext.AddLink(foodItem, "FoodIngredient", ingredient);
});
}