Каков наилучший способ заполнить данные большим количеством информации, используя EntityFramework Core? - PullRequest
1 голос
/ 16 марта 2020

У меня есть файл конфигурации сущностей, и я заполняю данные с помощью HasData, пример ниже.

public class PublicationConfiguration : IEntityTypeConfiguration<Publication>
    {
        public void Configure(EntityTypeBuilder<Publication> builder)
        {
            builder.Property(p => p.Image)
                .HasMaxLength(256)
                .HasDefaultValue("default-publication.png")
                .IsRequired();

            builder.Property(p => p.Title)
                .HasMaxLength(256)
                .IsRequired();

            builder.Property(p => p.Value)
                .IsRequired();

            builder.Property(p => p.PublisherId)
                .IsRequired();

            builder.Property(p => p.CategoryId)
                .IsRequired();

            builder.HasOne(p => p.Category)
                .WithMany(categ => categ.Publications)
                .OnDelete(DeleteBehavior.Restrict);

            builder.HasOne(p => p.Publisher)
                .WithMany(pub => pub.Publications)
                .OnDelete(DeleteBehavior.Restrict);

            builder.HasData(
                new Publication {
                    Id = "publication-one",
                    Title = "the first publication",
                    Value = "the content of the very first publication on the web-site",
                    CreatedAt = DateTime.Now,
                    CategoryId = "category-one",
                    PublisherId = "publisher-one",
                    Image = "image"
                },
                new Publication
                {
                    Id = "publication-two",
                    Title = "the second publication",
                    Value = "the content of the second publication on the web-site",
                    CreatedAt = DateTime.Now,
                    CategoryId = "category-one",
                    PublisherId = "publisher-two",
                    Image = "image"
                },
                new Publication
                {
                    Id = "publication-three",
                    Title = "the third publication",
                    Value = "the content of the third publication on the web-site",
                    CreatedAt = DateTime.Now,
                    CategoryId = "category-two",
                    PublisherId = "publisher-one",
                    Image = "image"
                }
            );
        }
    }

Как видите, у меня есть свойство с именем Value, это просто string, но я собираюсь изменить его на массив строк и добавить некоторую реальную информацию, означающую, что Value будет содержать более тысячи символов, более того, здесь есть только 3 Publications, но я хочу добавить еще 10. Таким образом, моя сеялка будет выглядеть огромной и ужасной, и мне это не нравится.

Так что я хотел бы переместить эти данные куда-нибудь еще, может быть, в файл json, а затем прочитать данные из этого файла или, возможно, есть лучший способ, тем не менее, я понятия не имею, как я могу сделать это и как это сделать правильно.

Вопрос в том, что является лучшим решением этой проблемы? И я был бы рад увидеть код решения.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Можно создать несколько начальных чисел, создав файл json.

Создайте новый метод с именем SeedLargData в своем классе PublicationConfiguration.

В этом методе получите данные в файле json, преобразуйте их в List<Publication> и верните их в метод Configure.

 public class PublicationConfiguration : IEntityTypeConfiguration<Publication>
    {
        public void Configure(EntityTypeBuilder<Publication> builder)
        {
           builder.Property(p => p.Image)
            .HasMaxLength(256)
            .HasDefaultValue("default-publication.png")
            .IsRequired();

           builder.Property(p => p.Title)
            .HasMaxLength(256)
            .IsRequired();

           builder.Property(p => p.Value)
            .IsRequired();

           builder.Property(p => p.PublisherId)
            .IsRequired();

           builder.Property(p => p.CategoryId)
            .IsRequired();

           builder.HasOne(p => p.Category)
            .WithMany(categ => categ.Publications)
            .OnDelete(DeleteBehavior.Restrict);

           builder.HasOne(p => p.Publisher)
            .WithMany(pub => pub.Publications)
            .OnDelete(DeleteBehavior.Restrict);

            builder.HasData(SeedLargData());
        }

       public List<Publication> SeedLargData()
        {
            var publications= new List<Publication>();
            using (StreamReader r = new StreamReader(@"json file path"))
            {
                string json = r.ReadToEnd();
                publications= JsonConvert.DeserializeObject<List<Publication>>(json);
            }
            return publications;
        }
    }    
0 голосов
/ 18 марта 2020

Ответ выше работает, но я сделал его многоразовым.

Вот результат.

public static class SeedHelper
    {
        public static List<TEntity> SeedData<TEntity>(string fileName)
        {
            string currentDirectory = Directory.GetCurrentDirectory();
            string path = "Static/Json";
            string fullPath = Path.Combine(currentDirectory, path, fileName);

            var result = new List<TEntity>();
            using (StreamReader reader = new StreamReader(fullPath))
            {
                string json = reader.ReadToEnd();
                result = JsonConvert.DeserializeObject<List<TEntity>>(json);
            }

            return result;
        }
    }

Надеюсь, вы понимаете, что "Static/Json" - это путь, где мои json файлы находятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...