EF核心-主键值在多对多关系中不一致

时间:2019-02-10 11:30:24

标签: c# entity-framework-core

我有2个表BookAuthor,它们具有多对多关系。此处采用了实体框架核心(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();

        }
    }
}

1 个答案:

答案 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有关。