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);
    });
}