public void Automatically_migrate_to_new_Schema() { var repository = new BlogRepository(redisClient); //Populate the datastore with the old schema from the 'BlogPostBestPractice' BlogPostBestPractice.InsertTestData(repository); //Create a typed-client based on the new schema using (var redisBlogPosts = redisClient.GetTypedClient <New.BlogPost>()) { //Automatically retrieve blog posts IList <New.BlogPost> allBlogPosts = redisBlogPosts.GetAll(); //Print out the data in the list of 'New.BlogPost' populated from old 'BlogPost' type //Note: renamed fields are lost Debug.WriteLine(allBlogPosts.Dump()); /*Output: * [ * { * Id: 3, * BlogId: 2, * PostType: None, * Title: Redis, * Labels: [], * Tags: * [ * Redis, * NoSQL, * Scalability, * Performance * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 2010-04-28T21:42:03.9484725Z * } * ] * }, * { * Id: 4, * BlogId: 2, * PostType: None, * Title: Couch Db, * Labels: [], * Tags: * [ * CouchDb, * NoSQL, * JSON * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 2010-04-28T21:42:03.9484725Z * } * ] * }, * { * Id: 1, * BlogId: 1, * PostType: None, * Title: RavenDB, * Labels: [], * Tags: * [ * Raven, * NoSQL, * JSON, * .NET * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 2010-04-28T21:42:03.9004697Z * }, * { * Content: Second Comment!, * CreatedDate: 2010-04-28T21:42:03.9004697Z * } * ] * }, * { * Id: 2, * BlogId: 1, * PostType: None, * Title: Cassandra, * Labels: [], * Tags: * [ * Cassandra, * NoSQL, * Scalability, * Hashing * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 2010-04-28T21:42:03.9004697Z * } * ] * } * ] * */ } }
public void Manually_migrate_to_new_Schema_using_a_custom_tranlation() { var repository = new BlogRepository(redisClient); //Populate the datastore with the old schema from the 'BlogPostBestPractice' BlogPostBestPractice.InsertTestData(repository); //Create a typed-client based on the new schema using (var redisBlogPosts = redisClient.GetTypedClient <BlogPost>()) using (var redisNewBlogPosts = redisClient.GetTypedClient <New.BlogPost>()) { //Automatically retrieve blog posts IList <BlogPost> oldBlogPosts = redisBlogPosts.GetAll(); //Write a custom translation layer to migrate to the new schema var migratedBlogPosts = oldBlogPosts.ConvertAll(old => new New.BlogPost { Id = old.Id, BlogId = old.BlogId, Title = old.Title, Content = old.Content, Labels = old.Categories, //populate with data from renamed field PostType = New.BlogPostType.Article, //select non-default enum value Tags = new HashSet <string>(old.Tags), Comments = old.Comments.ConvertAll(x => new Dictionary <string, string> { { "Content", x.Content }, { "CreatedDate", x.CreatedDate.ToString() }, }), NoOfComments = old.Comments.Count, //populate using logic from old data }); //Persist the new migrated blogposts redisNewBlogPosts.StoreAll(migratedBlogPosts); //Read out the newly stored blogposts var refreshedNewBlogPosts = redisNewBlogPosts.GetAll(); //Note: data renamed fields are successfully migrated to the new schema Debug.WriteLine(refreshedNewBlogPosts.Dump()); /* * [ * { * Id: 3, * BlogId: 2, * PostType: Article, * Title: Redis, * Labels: * [ * NoSQL, * Cache * ], * Tags: * [ * Redis, * NoSQL, * Scalability, * Performance * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 28/04/2010 22:58:35 * } * ], * NoOfComments: 1 * }, * { * Id: 4, * BlogId: 2, * PostType: Article, * Title: Couch Db, * Labels: * [ * NoSQL, * DocumentDB * ], * Tags: * [ * CouchDb, * NoSQL, * JSON * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 28/04/2010 22:58:35 * } * ], * NoOfComments: 1 * }, * { * Id: 1, * BlogId: 1, * PostType: Article, * Title: RavenDB, * Labels: * [ * NoSQL, * DocumentDB * ], * Tags: * [ * Raven, * NoSQL, * JSON, * .NET * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 28/04/2010 22:58:35 * }, * { * Content: Second Comment!, * CreatedDate: 28/04/2010 22:58:35 * } * ], * NoOfComments: 2 * }, * { * Id: 2, * BlogId: 1, * PostType: Article, * Title: Cassandra, * Labels: * [ * NoSQL, * Cluster * ], * Tags: * [ * Cassandra, * NoSQL, * Scalability, * Hashing * ], * Comments: * [ * { * Content: First Comment!, * CreatedDate: 28/04/2010 22:58:35 * } * ], * NoOfComments: 1 * } * ] * */ } }