public void Merge(TrackPlayer originalPlayer)
        {
            // simple fields just use original player
            FreeCompany = originalPlayer.FreeCompany;
            CategoryId  = originalPlayer.CategoryId;
            Icon        = originalPlayer.Icon;
            Color       = originalPlayer.Color;
            Alert       = originalPlayer.Alert;
            CategoryId  = originalPlayer.CategoryId;

            // names
            if (Names == null)
            {
                Names = new List <string>();
            }
            foreach (var name in originalPlayer.Names)
            {
                if (!Names.Contains(name))
                {
                    Names.Add(name);
                }
            }

            // home worlds
            if (HomeWorlds == null)
            {
                HomeWorlds = new List <TrackWorld>();
            }
            var newPlayerWorldIds        = HomeWorlds.Select(world => world.Id).ToList();
            var originalPlayerWorldIds   = originalPlayer.HomeWorlds.Select(world => world.Id).ToList();
            var originalPlayerWorldNames = originalPlayer.HomeWorlds.Select(world => world.Name).ToList();

            foreach (var worldId in originalPlayer.HomeWorlds.Select(world => world.Id).ToList())
            {
                if (!newPlayerWorldIds.Contains(worldId))
                {
                    HomeWorlds.Add(new TrackWorld
                    {
                        Id   = worldId,
                        Name = originalPlayerWorldNames[originalPlayerWorldIds.IndexOf(worldId)]
                    });
                }
            }

            // notes
            Notes = originalPlayer.Notes + " " + Notes;

            // encounters
            if (Encounters == null)
            {
                Encounters = new List <TrackEncounter>();
            }
            Encounters = Encounters.Concat(originalPlayer.Encounters).ToList()
                         .OrderBy(encounter => encounter.Created).ToList();

            // reset to ensure latest props
            ClearBackingFields();
        }
 public void NonDestructiveMerge(TrackPlayer originalPlayer)
 {
     if (Color == null)
     {
         Color = originalPlayer.Color;
     }
     if (Icon == 0)
     {
         Icon = originalPlayer.Icon;
     }
     if (CategoryId == 0)
     {
         CategoryId = originalPlayer.CategoryId;
     }
     Notes = originalPlayer.Notes + " " + Notes;
     ClearBackingFields();
 }