Вы неправильно настроили внешний ключ.Давайте рассмотрим ваш код Entity<Post>(entity=>{ /* ... */ })
:
modelBuilder.Entity<Post>(entity =>
{
entity.HasOne<Category>(s => s.Category)
.WithMany(c => c.Posts)
<b>.HasForeignKey(s => s.PostId);</b> // line A: it is not correct!
entity.HasOne<User>(s => s.User)
.WithMany(u => u.Posts)
<b>.HasForeignKey(s => s.PostId);</b> // line B: it is not correct!
entity.Property(s => s.CreatedAt)
.HasDefaultValueSql("SYSUTCDATETIME()");
});
Обратите внимание, что строка A и строка B неверны.Как и в обоих случаях, зависимым объектом является Post
.Ваш код приведет к внешнему ключу, как показано ниже:
CREATE TABLE [Posts] (
[PostId] int NOT NULL,
[Title] nvarchar(max) NOT NULL,
[Description] nvarchar(max) NOT NULL,
[Text] nvarchar(max) NOT NULL,
[CreatedAt] datetime2 NOT NULL DEFAULT (SYSUTCDATETIME()),
[UpdatedAt] datetime2 NULL,
[UserId] int NOT NULL,
[CategoryId] int NOT NULL,
CONSTRAINT [PK_Posts] PRIMARY KEY ([PostId]),
CONSTRAINT [FK_Posts_Categories_PostId] FOREIGN KEY ([PostId]) REFERENCES [Categories] ([CategoryId]) ON DELETE NO ACTION,
CONSTRAINT [FK_Posts_Users_PostId] FOREIGN KEY ([PostId]) REFERENCES [Users] ([UserId]) ON DELETE NO ACTION
);
Поэтому вам нужно изменить свой код, как показано ниже:
modelBuilder.Entity<Post>(entity =>
{
entity.HasOne<Category>(s => s.Category)
.WithMany(c => c.Posts)
//.HasForeignKey(s => s.PostId);
.HasForeignKey(s => s.CategoryId);
entity.HasOne<User>(s => s.User)
.WithMany(u => u.Posts)
//.HasForeignKey(s => s.PostId);
.HasForeignKey(s => s.UserId);
entity.Property(s => s.CreatedAt)
.HasDefaultValueSql("SYSUTCDATETIME()");
});
По той же причине, вы также должны изменить частьEntity<Category>(entity=>{ /* ... */ })
как показано ниже:
modelBuilder.Entity<Category>(entity =>
{
entity.HasMany<Post>(c => c.Posts)
.WithOne(s => s.Category)
//.HasForeignKey(c => c.PostId) // remove this line
.HasForeignKey(c => c.CategoryId) // add this line
.OnDelete(DeleteBehavior.Restrict);
entity.Property(c => c.CreatedAt)
.HasDefaultValueSql("SYSUTCDATETIME()");
});