实体框架-相关行无故重复

时间:2018-07-05 07:18:07

标签: c# entity-framework

我有一个“ AddBookForm”,它将“作者”作为参数。打开表单后,我输入书名,然后将书与作者作为关系保存。 问题是,当我保存这本书时,我也可以在数据库中找到一个新的作者条目,并且该书与该新条目相关。

作为示例:我有一个ID为6且名称为“ Franz Kafka”的作者,并将该作者对象作为参数添加到我的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 :(得分:1)

数据库中的所有属性都应来自相同的DbContext。您的Author属性来自与单击按钮不同的DbContext,因此EF将自动创建一个新的DbContext。

尝试一下:

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();
}

这将在与新书相同的上下文中检索作者,因此不会创建新记录。

相关问题