oData SharePoint Add List Item Containing Value Properties

453 views Asked by At

How do you save "Value" and "DataServiceCollection" objects that are part of another SharePoint list item? These are the only properties in my model that are not getting saved.

The generated Food SharePoint model has these sort of properties:

public class Food
{
    DataServiceCollection<FoodIngredientValue> Ingredient;
    FoodStateValue State;
    string _StateValue
}

First, I don't know why there are two ways to add a state value in the model generated by SharePoint. I try populating either one and the state value doesn't populate in SharePoint.

Secondly, I tried populating the Ingredient collection through hard coding FoodIngredientValue objects to the food model before saving and also by querying SharePoint and assigning them to the Ingredient property but it doesn't get saved in SharePoint.

I add a new food item to the SharePoint list using the code below and I verified all three properties are populated in my model but none of them get saved.

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

There are 1 answers

0
Adam On BEST ANSWER

This was a great blog post explaining how to link complex list items (DataServiceCollecton and Value objects) in the SharePoint oData API:

http://blog.heeresonline.com/2014/07/sharepoint-wcf-dataservices-choice-lookup-column-editing/

The important thing to remember is to add the new item to the data context before you begin populating complex fields of type DataServiceCollection or Value objects. In the case of properties of type DataServiceCollection, there is a little more work that needs to be done to link them properly so they are saved in the data context as shown below for Ingredient. Here is an example of the code that finally worked:

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