我有2个表Book
和Author
,它们具有多对多关系。此处采用了实体框架核心(2.2.1版)的多对多实现:https://docs.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many。
我不知道为什么当我添加与相关作者的新书时,使用BookAuthor
表作为支持多对多关系的附加表,Author
实体的主键不一致Id
属性如下:2,4,6,...而不是1,2,3,...
这是我的代码:
public class Author
{
public int Id { get; set; }
public string FullName { get; set; }
public ICollection<BookAuthor> BookAuthors { get; set; }
}
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public ICollection<BookAuthor> BookAuthors { get; set; }
}
public class BookAuthor
{
public int BookId { get; set; }
public Book Book { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Author> Authors { get; set; }
public DbSet<BookAuthor> BookAuthors { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BookAuthor>()
.HasKey(x => new {x.BookId, x.AuthorId});
modelBuilder.Entity<BookAuthor>()
.HasOne(pt => pt.Book)
.WithMany(p => p.BookAuthors)
.HasForeignKey(pt => pt.BookId);
modelBuilder.Entity<BookAuthor>()
.HasOne(pt => pt.Author)
.WithMany(t => t.BookAuthors)
.HasForeignKey(pt => pt.AuthorId);
}
}
这是我与作者一起添加新书的方式:
class Program
{
static void Main(string[] args)
{
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase("test")
.Options;
using (var context = new AppDbContext(options))
{
var book = new Book
{
Title = "Test Book",
BookAuthors = new List<BookAuthor>
{
new BookAuthor
{
Author = new Author
{
FullName = "Test name"
}
},
new BookAuthor
{
Author = new Author
{
FullName = "Author #2"
}
}
}
};
context.Books.Add(book);
context.SaveChanges();
}
}
}
答案 0 :(得分:1)
在您的示例中,您使用UseInMemoryDatabase
并不是一个仅用于测试的合适数据库,如果您使用MS SQL Server或SQL Azure尝试代码,则生成的ID将为1,2,3。 ..如您所愿。
如果您查看MS文档: https://docs.microsoft.com/en-us/ef/core/providers/in-memory/ “此数据库提供程序允许Entity Framework Core与内存数据库一起使用。尽管内存模式下的SQLite提供程序可能是关系数据库的更合适的测试替代方法,但这对测试很有用。”
我尝试过使用SQLite进行编码,Id也可以。因此,这不是EF Core问题,与InMemoryDatabase有关。