I have created a custom facet model with **Sitecore 9.0.1** & **xConnect**. 

My contact custom facet contains a property of `List<string>` which I want to populate with different values while contact visiting the site. 

*N.B. I have indexed the anonymous contacts.* 

I am trying to save the new item in the list using `contact.SetFacet<MyCustomFacet>...`and then adding item to facet, but the problem is the list becomes empty again when I use `contact.GetFacet<MyCustomFacet>...`. 

I am submitting the client each time after adding a item. Do I really need that? or, will it automatically saved at session end? I am looking for right way to achieve that. 

I want to keep all the items I added to the list available till the session end so that I can use them whenever needed.

    public static void AddDynamicFacetItem(DynamicFacetItem facetData)
    {
        var manager = AnalyticsHelpers.GetContactManager();
    
        if (manager != null)
        {
            using (var client = SitecoreXConnectClientConfiguration.GetClient())
            {
                try
                {
                    var item = facetData.ConvertToData();
    
                    if (AnalyticsHelpers.CurrentTracker.Contact.IsNew)
                    {
                        Sitecore.Analytics.Tracker.Current.Contact.ContactSaveMode = ContactSaveMode.AlwaysSave;
                        manager.SaveContactToCollectionDb(Sitecore.Analytics.Tracker.Current.Contact);
    
                        var trackerIdentifier = new IdentifiedContactReference(
                            Sitecore.Analytics.XConnect.DataAccess.Constants.IdentifierSource,
                            Sitecore.Analytics.Tracker.Current.Contact.ContactId.ToString("N"));
    
                        var contact = client.Get<Contact>(trackerIdentifier,
                            new Sitecore.XConnect.ContactExpandOptions());
    
                        AddItemForNewContact(client, contact, item);
                    }
                    else
                    {
                        var trackerIdentifier = new IdentifiedContactReference(
                            Sitecore.Analytics.XConnect.DataAccess.Constants.IdentifierSource,
                            Sitecore.Analytics.Tracker.Current.Contact.ContactId.ToString("N"));
    
                        var contact = client.Get<Contact>(trackerIdentifier,
                            new Sitecore.XConnect.ContactExpandOptions(DynamicDataFacet.DefaultFacetKey));
    
                        AddItemForExistingContact(client, contact, item);
                    }
    
                    manager.RemoveFromSession(AnalyticsHelpers.CurrentTracker.Contact.ContactId);
                }
                catch (Exception e)
                {
                    Sitecore.Diagnostics.Log.Error(e.Message, e, "AddDynamicFacetItem");
                }
            }
        }
    }
    
    private static void AddItemForNewContact(XConnectClient client, Sitecore.XConnect.Contact contact,
        XYZ.Model.Data data)
    {
        try
        {
            if (contact != null)
            {
                var list = new List<Data> { data };
    
                client.SetFacet<DynamicDataFacet>(contact, DynamicDataFacet.DefaultFacetKey, new DynamicDataFacet()
                {
                    Data = list
                });
    
                client.Submit();
            }
        }
        catch (Exception e)
        {
            Sitecore.Diagnostics.Log.Error(e.Message, e, "AddItemForNewContact");
        }
    }
    
    private static void AddItemForExistingContact(XConnectClient client, Sitecore.XConnect.Contact contact,
        XYZ.Model.Data data)
    {
        try
        {
            if (contact != null)
            {
                if (contact.DynamicData() != null)
                {
                    contact.DynamicData().Data.Add(data);
                }
                else
                {
                    var list = new List<Data> { data };
    
                    client.SetFacet<DynamicDataFacet>(contact, DynamicDataFacet.DefaultFacetKey,
                        new DynamicDataFacet()
                        {
                            Data = list
                        });
                }
    
                client.Submit();
            }
        }
        catch (Exception e)
        {
            Sitecore.Diagnostics.Log.Error(e.Message, e, "AddItemForExistingContact");
        }
    }

[xdb_collection].ContactFacets data:

    2DBF166D-45E5-0000-0000-0539A599359D	DynamicData	2018-03-16 11:30:16.5605749	C8032A2E-C837-4FA1-B150-B559EFE237DD	{"@odata.type":"#xyz.Model.DynamicDataFacet","Data":[{"PropertyName":"Discount.Amount","Type":"System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","Value":"1520"}]}

JSON:

    {
      "Name": "XYZ.Model.DynamicDataModel",
      "Version": "1.0",
      "References": [
        {
          "Name": "XConnect",
          "Version": "1.0"
        },
        {
          "Name": "Sitecore.XConnect.Collection.Model",
          "Version": "9.0"
        }
      ],
      "Types": {
        "XYZ.Model.DynamicDataFacet": {
          "Type": "Facet",
          "BaseType": "Sitecore.XConnect.Facet",
          "ClrType": "XYZ.Model.DynamicDataFacet, XYZ, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
          "Properties": {
            "Data": {
              "Type": [
                "XYZ.Model.Data"
              ]
            }
          }
        },
        "XYZ.Model.Data": {
          "Type": "Complex",
          "ClrType": "XYZ.Model.Data, XYZ, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
          "Properties": {
            "PropertyName": {
              "Type": "String"
            },
            "Type": {
              "Type": "String"
            },
            "Value": {
              "Type": "String"
            }
          }
        }
      },
      "Facets": [
        {
          "Target": "Contact",
          "Name": "DynamicData",
          "Type": "XYZ.Model.DynamicDataFacet"
        }
      ]
    }

Model

    namespace XYZ.Model
    {
        [Serializable]
        [FacetKey(DefaultFacetKey)]
        public class DynamicDataFacet : Facet
        {
            public const string DefaultFacetKey = "DynamicData";
            public List<Data> Data { get; set; }
    
            public DynamicDataFacet()
            {
                Data = new List<Data>();
            }
        }
    }

    namespace XYZ.Model
    {
        [Serializable]
        public class Data
        {
            public string PropertyName { get; set; }
            public string Type { get; set; }
            public string Value { get; set; }
        }
    }

    namespace XYZ.Model
    {
        public class DynamicDataModel
        {
            public static XdbModel Model { get; } = BuildModel();
    
            private static XdbModel BuildModel()
            {
                XdbModelBuilder modelBuilder = new XdbModelBuilder("XYZ.Model.DynamicDataModel", new XdbModelVersion(1, 0));
                modelBuilder.ReferenceModel(Sitecore.XConnect.Collection.Model.CollectionModel.Model);
                modelBuilder.DefineFacet<Contact, DynamicDataFacet>(DynamicDataFacet.DefaultFacetKey);
                return modelBuilder.BuildModel();
            }
        }
    }