Импорт записей из 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.
