Я пытаюсь протестировать свое приложение, но получаю эту ошибку: 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».