EF Core - значения первичного ключа не согласованы во многих отношениях - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть 2 таблицы Book и Author со многими отношениями.Реализация многих для многих для Entity Framework Core (v. 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 голосов
/ 10 февраля 2019

В вашем примере вы используете UseInMemoryDatabase это не правильная БД, она просто предназначена для тестирования, если вы попробуете свой код с MS SQL Server или SQL Azure, сгенерированные идентификаторы будут 1,2,3 ...как вы ожидаете.

Если вы проверяете документы MS: https://docs.microsoft.com/en-us/ef/core/providers/in-memory/ "Этот поставщик базы данных позволяет использовать Entity Framework Core с базой данных в памяти. Это может быть полезно для тестирования, хотяпоставщик SQLite в режиме in-memory может быть более подходящей заменой теста для реляционных баз данных. "

Я пробовал вам кодировать с SQLite, и идентификаторы также в порядке.Итак, это не проблема EF Core, это связано с InMemoryDatabase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...