Импорт записей из WordPress в приложение на ASP.NET MVC 4
Модель данных
Создадим три сущности — пост, категория и тег. У каждого поста может быть одна категория и несколько тегов.
[Table("Category")] public class Category { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int CategoryId { get; set; } public string Name { get; set; } } [Table("Tag")] public class Tag { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int TagId { get; set; } public string Name { get; set; } public ICollection<Post> Posts { get; private set; } public Tag() { this.Posts = new List<Post>(); } } [Table("Post")] public class Post { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int PostId { get; set; } public string Title { get; set; } [Column(TypeName = "ntext")] public string Body { get; set; } public Category PostCategory { get; set; } public ICollection<Tag> PostTags { get; set; } public Post() { this.PostTags = new List<Tag>(); } }
Для доступа к данным создаем контекст
public class PostContext : DbContext { public PostContext() : base("DefaultConnection") { } public DbSet<Post> Posts { get; set; } public DbSet<Category> Categories { get; set; } public DbSet<Tag> Tags { get; set; } }
Благодаря механизму Code First в Entity Framework, база создастся сама. Для определения названий таблиц и типов свойств используются атрибуты. Думаю, из кода все понятно.
Многие ко многим
У каждого поста может быть несколько тегов и каждый тег может относиться к нескольким постам. Нужна связь «многие ко многим», благо она в EntityFramework делается легко. Добавляем в контекст переопределенный метод
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Post>(). HasMany(p => p.PostTags). WithMany(t => t.Posts). Map(m => { m.MapLeftKey("PostId"); m.MapRightKey("TagId"); m.ToTable("PostTagLinks"); } ); }
Чтение данных из wordpress
Читать данные конечно будем по rss. Rss мы будем получать вот по таким ссылкам
http://lsreg.ru/feed/?paged=2
Для работы с рсс есть отличный класс SyndicationFeed. Используется он так
using (var reader = XmlReader.Create(this.GetRssFeedUrl(blog, page))) feed = SyndicationFeed.Load(reader);
Дальше проходим по свойству Items и для каждой записи в рсс создаем пост.
Есть несколько особенностей:
Тело поста приходится получать так:
item.ElementExtensions.ReadElementExtensions<string>("encoded", "http://purl.org/rss/1.0/modules/content/").First();
Категории и теги хранятся вместе, в свойстве Categories. Сначала категории, потом теги.
Вот и все, этого достаточно, чтобы перетащить все записи из wordpress.