Entity Framework - Связанная строка дублируется без какой-либо причины - PullRequest
0 голосов
/ 05 июля 2018

У меня есть «AddBookForm», который получает Author в качестве параметра. Когда форма открывается, я ввожу название книги, а затем книга должна быть сохранена с автором как отношение. Проблема в том, что, когда я сохраняю книгу, я могу найти в базе данных новую запись автора, и книга становится связанной с новой.

В качестве примера: у меня есть Автор с ID 6 и именем «Франц Кафка», и я передаю этот Author-Object в качестве параметра моей AddBookForm. Я ввожу заголовок и нажимаю «сохранить», затем в Базе данных я могу найти нового Автора с последовательным номером 7 с тем же Именем, и только что добавленная Книга связана с ID 7 вместо 6.

class Book
{
    public int Id { get; set; }
    public Author Author { get; set; }
    public string Title { get; set; }
}

using (AddBookForm frm = new AddBookForm(author))
{
    frm.ShowDialog();
}

public partial class AddBookForm: Form
{
    Author author;

    public AddBookForm(Author author)
    {
        InitializeComponent();
        this.author = author;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        using (MyDbContext db = new MyDbContext())
        {
            Book book = new Book();
            book.Title = textBox1.Text;
            book.Author = this.author;

            db.Books.Add(book);
            db.SaveChanges();

            this.Close();
        }
    }
}

1 Ответ

0 голосов
/ 05 июля 2018

Все свойства из базы данных должны исходить из одного и того же DbContext. Свойство Author принадлежит другому DbContext, отличному от того, который указан при нажатии кнопки, поэтому EF автоматически создаст новое.

Попробуйте это:

using (MyDbContext db = new MyDbContext())
{
    Book book = new Book();
    book.Title = textBox1.Text;
    book.Author = db.Find(this.author.Id);

    db.Books.Add(book);
    db.SaveChanges();

    this.Close();
}

Это позволит найти автора в том же контексте, что и новая книга, и, следовательно, не создаст новую запись.

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