Чтобы заполнить эти посты, я считаю, что мне нужно:
Получить соответствующий идентификатор категории для каждого CategoryName;
Создать идентификатор для каждого сообщения.
Да!Ты прав!Вы должны использовать CategoryId
вместо CategoryName
в Post
, потому что CategoryId
- это ключ реляции, а не CategoryName
.Таким образом, ваш контент YML должен выглядеть следующим образом:
new {Id = 1, CategoryId = 1, Title = "A", Content = "A Content" },
new {Id = 2, CategoryId = 2, Title = "B", Content = "B Content" }
Затем в OnModelCreating
из DbConext
следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var posts = _service.GetPostsFromYMLFiles(path);
modelBuilder.Entity<Category>().HasData(
new { Id = 1, Name = "Reading"},
new { Id = 2, Name = "Travelling" }
);
modelBuilder.Entity<Post>().HasData(posts);
}
Эти файлы YML созданытретьей стороной, и я не могу их изменить.
Затем вы должны написать собственный метод обслуживания, где вы будете проверять каждое сообщение в файле YMl с помощью CategoryName
, затем вы должны составить новый список Post
, где вы замените CategoryName
на CateogryId
и его соответствующее значение следующим образом:
public class YmlPost
{
public string CategoryName { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
public class SeedDataService
{
static List<Category> categoryList = new List<Category>()
{
new Category { Id = 1, Name = "Reading" },
new Category { Id = 2, Name = "Traveling" }
};
public static List<Category> GetCategoriesForSeeding()
{
return categoryList;
}
public static List<Post> GetPostsForSeeding()
{
List<YmlPost> postListFromYML = _service.GetPostsFromYMLFiles(path);
List<Post> posts = postListFromYML.Select((p, i) => new Post
{
Id = i+1, // index is 0 based that's why you have to add 1.
Title = p.Title,
Content = p.Content,
CategoryId = categoryList.Single(c => c.Name ==
p.CategoryName).Id
}).ToList();
return posts;
}
}
Затем в OnModelCreating
из DbConext
следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var categories = SeedDataService.GetCategoriesForSeeding();
modelBuilder.Entity<Category>().HasData(categories);
var posts = SeedDataService.GetPostsForSeeding();
modelBuilder.Entity<Post>().HasData(posts);
}