使用 SQLite 和 Entity Framework 进行数据绑定
Databinding using SQLite and Entity Framework
首先,这是我要实现的目标:
我想要一个视图,如果它的任何控件的属性发生变化(简单!),它会自动将任何更改推送到 SQLite 数据库。
我的逻辑,由于缺乏经验,也可能是假的:
- Add an empty object to the Database
- Get its instance back from the Context
- 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"。
通常你:
- 从数据库中获取一些数据并让 EF 将它们公开为对象集合
- 根据需要修改此集合,添加、删除和编辑对象
- 将更改推送到调用 SaveChanges 的数据库
- 处理 DbContext 并重新开始一个新的
在您的示例中,您将在第 1 阶段结束后立即处理 DbContext。
EF 不再跟踪您的对象,因此它不知道您更改了什么,也不会向数据库推送任何内容。
在评论中你说 "My property is now set to the DB object"。
不是。它被设置为一个对象,该对象最初由 EF 检索,但 EF "forgot about it" 在您处理 DbContext 的那一刻。该对象仍然存在只是因为您仍在使用 "book" 变量引用它。
首先,这是我要实现的目标:
我想要一个视图,如果它的任何控件的属性发生变化(简单!),它会自动将任何更改推送到 SQLite 数据库。
我的逻辑,由于缺乏经验,也可能是假的:
- Add an empty object to the Database
- Get its instance back from the Context
- 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"。 通常你:
- 从数据库中获取一些数据并让 EF 将它们公开为对象集合
- 根据需要修改此集合,添加、删除和编辑对象
- 将更改推送到调用 SaveChanges 的数据库
- 处理 DbContext 并重新开始一个新的
在您的示例中,您将在第 1 阶段结束后立即处理 DbContext。 EF 不再跟踪您的对象,因此它不知道您更改了什么,也不会向数据库推送任何内容。
在评论中你说 "My property is now set to the DB object"。 不是。它被设置为一个对象,该对象最初由 EF 检索,但 EF "forgot about it" 在您处理 DbContext 的那一刻。该对象仍然存在只是因为您仍在使用 "book" 变量引用它。