Начальный объект для типа объекта «Публикация» не может быть добавлен, поскольку не было предоставлено значение для обязательного свойства «Изображение» - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь протестировать свое приложение, но получаю эту ошибку: The seed entity for entity type 'Publication' cannot be added because there was no value provided for the required property 'Image'

Проблема в том, что значение действительно задано.

Я пытаюсь заполнить некоторые данные для тестирования таким образом:

public static class NewsierContextFactory
    {
        public static NewsierContext Create()
        {
            var options = new DbContextOptionsBuilder<NewsierContext>()
                .UseInMemoryDatabase(Guid.NewGuid().ToString())
                .Options;

            var dateTimeMock = new Mock<IDateTime>();
            dateTimeMock.Setup(m => m.Now)
                .Returns(new DateTime(3001, 1, 1));

            var context = new NewsierContext(options, dateTimeMock.Object);

            context.Database.EnsureCreated();

            context.Publishers.AddRange(
                  new Publisher()
                  {
                      Id = "one",
                      Image = "default-user.png",
                      Name = "Name",
                      Surname = "Surname",
                      Email = "test@email.com",
                      Password = "publisher",
                      Role = "admin",
                      CreatedAt = DateTime.Now,
                      LastModifiedAt = DateTime.Now
                  }
              );

            context.Categories.AddRange(
                new Category()
                {
                    Id = "one",
                    Name = "categ",
                    CreatedAt = DateTime.Now,
                    LastModifiedAt = DateTime.Now
                }
            );

            context.Publications.AddRange(
                new Publication
                {
                    Id = "one",
                    Image = "default-publication.png",
                    Title = "title",
                    Value = "value",
                    Views = 37,
                    CategoryId = "one",
                    PublisherId = "one",
                    CreatedAt = DateTime.Now,
                    LastModifiedAt = DateTime.Now
                }
            );

            context.SaveChanges();

            return context;
        }

        public static void Destroy(NewsierContext context)
        {
            context.Database.EnsureDeleted();

            context.Dispose();
        }
    }

Как видите, у моего объекта Publisher есть точное значение «Изображение». И также они оба имеют одинаковую конфигурацию для этого значения.

public class PublisherConfiguration : IEntityTypeConfiguration<Publisher>
    {
        public void Configure(EntityTypeBuilder<Publisher> builder)
        {
            builder.Property(p => p.Image)
                .HasMaxLength(256)
                .HasDefaultValue("Static/Images/default-user.png")
                .IsRequired();

            builder.Property(p => p.Name)
                .HasMaxLength(32)
                .IsRequired();

            builder.Property(p => p.Surname)
                .HasMaxLength(64)
                .IsRequired();

            builder.Property(p => p.Email)
                .HasMaxLength(128)
                .IsRequired();

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

            builder.Property(p => p.Role)
                .HasMaxLength(12)
                .HasDefaultValue("publisher")
                .IsRequired();

            builder.HasData(
                new Publisher
                {
                    Id = "publisher-one",
                    Name = "name",
                    Surname = "sur",
                    Email = "admin@newsier.com",
                    Password = "admin",
                    Role = "admin",
                    CreatedAt = DateTime.Now
                },
                new Publisher
                {
                    Id = "publisher-two",
                    Name = "name",
                    Surname = "sur",
                    Email = "admin@email.com",
                    Password = "publisher",
                    Role = "publisher",
                    CreatedAt = DateTime.Now
                }
            );
        }
    }
public class PublicationConfiguration : IEntityTypeConfiguration<Publication>
    {
        public void Configure(EntityTypeBuilder<Publication> builder)
        {
            builder.Property(p => p.Image)
               .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"
                },
                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"
                }
            );
        }
    }

Вот мои сущности:

public class Publisher : BaseEntity
    {
        public Publisher()
        {
            Publications = new HashSet<Publication>();
        }

        public string Image { get; set; }
        public string Name { get; set; }
        public string Surname { get; set; }
        public string Email { get; set; }
        public string Password { get; set; }
        public string Role { get; set; }

        public ICollection<Publication> Publications { get; set; }
    }
public class Publication : BaseEntity
    {
        public string Image { get; set; }
        public string Title { get; set; }
        public string Value { get; set; }
        public long Views { get; set; }

        public string PublisherId { get; set; }
        public Publisher Publisher { get; set; }

        public string CategoryId { get; set; }
        public Category Category { get; set; }
    }

А также базовая сущность:

public class BaseEntity
    {
        public string Id { get; set; }
        public DateTime CreatedAt { get; set; }
        public DateTime LastModifiedAt { get; set; }
    }

Я попытался удалить свойство «Изображение» из публикации, и ошибка исчезла, но в издателе есть то же значение «Изображение», и оно не выдает никаких ошибок.

Как я могу это исправить и почему это не проблема для сущности Publicher?

И просто отметим, что миграции работают довольно хорошо. Это означает, что я могу добавить некоторые данные, используя «HasData», но я не могу сделать то же самое с «Add» или «AddRange».

1 Ответ

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

Итак, я думаю, что вы ищете ответ здесь: Значения начальных значений должны отличаться от значений по умолчанию

Причина, по которой Publisher работает, заключается в том, что начальное значение и HasData значения для Image различны. Значения Publication приравниваются к одному и тому же значению default-publication.png, и, очевидно, это заставляет сеялку думать, что вы не установили его?

Да, это также заставило меня поднять бровь.

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