【发布时间】:2020-04-17 17:45:08
【问题描述】:
我正在处理一个无法更改数据库的旧项目,我正在使用 .net core 3 创建一个新 API。
我有两个表 page 和 Note 有共同的 PageId 和 BookId,因此每个 Note 都有一个具有相同 BookId 和 PageId 的页面
public class Note
{
public int Id { get; set; }
public int BookId { get; set; }
public int PageId { get; set; }
public string Text { get; set; }
}
public class Page
{
[Key]
public int MainId { get; set; } // this is the primary key
public int BookId { get; set; }
public int PageId { get; set; }
public string Content { get; set; }
}
PageId 不是 Page 的主键并且具有重复值。 我想通过note id来获取页面,我是这样做的:
[HttpGet("{id}")]
public async Task<ActionResult> GetPageByNoteId(int noteId)
{
var note = await db.Notes.FindAsync(id);
var page = await db.Pages.Where(x => x.BookId == note.BookId && x.PageId == note.PageId)
.FirstOrDefaultAsync();
return Ok(new {note,page});
}
有没有办法通过一次数据库命中来做到这一点?
更新:
页面的主键是MainId,但它应该是PageId和BookId,但我不能对数据库进行更改,如果我可以对数据库进行更改,我将对页面表进行以下操作:
删除
MainId列将
PageId和BookId设为主键
那么我可以这样做:
modelBuilder.Entity<Note>(entity =>
{
entity.HasOne(Note => Note.Page)
.WithOne(page => page.Note)
.HasForeignKey<Note>(note => new { note.PageId, note.BookId});
});
【问题讨论】:
标签: c# .net-core entity-framework-core