我有一些文章和作者,想要将它们链接如下:
文章作者
DbContext(数据库上下文)
在我运行了 dotnet ef database update 后,表格已经按预期创建。
一切看起来都很好,但当我尝试通过此服务添加一个带有作者的文章时,出现了问题: 服务
当我尝试添加一篇带有作者的文章时,我一直卡在这个错误上:
System.InvalidOperationException:实体类型“ArticleAuthor”上的属性“AuthorId”具有临时值。请明确设置永久值,或确保数据库配置为为此属性生成值。
- 任何文章都可以有任意数量的作者,
- 每个作者可以写任意数量的文章。
public class Article
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Title { get; set; }
public DateTime Date { get; set; }
public ICollection<ArticleAuthor> ArticleAuthors { get; set; }
}
Author
public class Author
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Column(TypeName = "text")] public string Name { get; set; }
[Column(TypeName = "text")] public string Email { get; set; }
public ICollection<ArticleAuthor> ArticleAuthors { get; set; }
}
文章作者
public class ArticleAuthor
{
public int ArticleId { get; set; }
public Article Article { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
}
DbContext(数据库上下文)
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Article> Articles { get; set; }
public DbSet<Author> Authors { get; set; }
public DbSet<ArticleAuthor> ArticleAuthors { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ArticleAuthor>()
.HasKey(bc => new {bc.ArticleId, bc.AuthorId});
modelBuilder.Entity<ArticleAuthor>()
.HasOne(bc => bc.Article)
.WithMany(b => b.ArticleAuthors)
.HasForeignKey(bc => bc.ArticleId);
modelBuilder.Entity<ArticleAuthor>()
.HasOne(bc => bc.Author)
.WithMany(c => c.ArticleAuthors)
.HasForeignKey(bc => bc.AuthorId);
}
}
在我运行了 dotnet ef database update 后,表格已经按预期创建。
一切看起来都很好,但当我尝试通过此服务添加一个带有作者的文章时,出现了问题: 服务
// POST: api/Articles
[HttpPost]
public async Task<IActionResult> PostArticle([FromBody] Article article)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_context.Articles.Add(article);
await _context.SaveChangesAsync();
return Ok(article);
}
JSON
{
"Title":"Title 2",
"ReadingTime" : 2,
"Date":"01.12.2019",
"Theme": "1",
"ArticleAuthors":[
{
"ID":"1"
}
]
}
当我尝试添加一篇带有作者的文章时,我一直卡在这个错误上:
System.InvalidOperationException:实体类型“ArticleAuthor”上的属性“AuthorId”具有临时值。请明确设置永久值,或确保数据库配置为为此属性生成值。
Author
列表,而不是一个ArticleAuthor
列表(“ID”?) - Ivan Stoev