The FixupCollection assigned to your ICollection is recreated as an array when deserialization occurs. Therefore, your product collection is read-only.
To change this, you can use the option (existing at least on VS2010) in the “Add service link” to change the type of the collection to something else (Generic.List or Generic.Observable).
But if you use the option to reuse the type that exists in the existing assembly and refer to the assembly containing your entity, the previous option will not apply to the existing type, and you will still have Array in your product collection.
, ( ), T4, , , FixupCollection,
if (<#=code.FieldName(navProperty)#>.IsReadOnly)
{
var newCollection = new FixupCollection<<#=code.Escape(navProperty.ToEndMember.GetEntityType())#>>(<#=code.FieldName(navProperty)#>);
newCollection.CollectionChanged += Fixup<#=navProperty.Name#>;
<#=code.FieldName(navProperty)#> = newCollection;
}