使用 SQLite 和 Entity Framework 进行数据绑定

Databinding using SQLite and Entity Framework

首先,这是我要实现的目标:

我想要一个视图,如果它的任何控件的属性发生变化(简单!),它会自动将任何更改推送到 SQLite 数据库。

我的逻辑,由于缺乏经验,也可能是假的:

  1. Add an empty object to the Database
  2. Get its instance back from the Context
  3. Bind this instance to the Control (simple TextBox for now)

我希望在更新 TextBox 时将数据推回数据库,但没有任何反应。

这是我的做法:

代码摘录:

AddBook(new Book ()); // First, add empty object for referencing.

Book book;
using (var context = new MyDataContext())
{
   book = context.Books.OrderByDescending(x => x.BookId).FirstOrDefault();       
}

SelectedBook = book; // My property is now set to the DB object.

和绑定:

<TextBox Text="{Binding SelectedBook.BookName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

我错过了什么?

你错过了很多:)

我相信您的 MyDataContext 扩展了 DbContext。 如果是这样,DbContext 应该是 "unit of work"。 通常你:

  1. 从数据库中获取一些数据并让 EF 将它们公开为对象集合
  2. 根据需要修改此集合,添加、删除和编辑对象
  3. 将更改推送到调用 SaveChanges 的数据库
  4. 处理 DbContext 并重新开始一个新的

在您的示例中,您将在第 1 阶段结束后立即处理 DbContext。 EF 不再跟踪您的对象,因此它不知道您更改了什么,也不会向数据库推送任何内容。

在评论中你说 "My property is now set to the DB object"。 不是。它被设置为一个对象,该对象最初由 EF 检索,但 EF "forgot about it" 在您处理 DbContext 的那一刻。该对象仍然存在只是因为您仍在使用 "book" 变量引用它。