【问题标题】:Databinding using SQLite and Entity Framework使用 SQLite 和实体框架进行数据绑定
【发布时间】:2015-05-12 18:55:18
【问题描述】:

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

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

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

  1. 向数据库中添加一个空对象
  2. 从上下文中取回它的实例
  3. 将此实例绑定到控件(现在是简单的文本框)

我希望在更新 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}"/>

我错过了什么?

【问题讨论】:

    标签: wpf entity-framework sqlite mvvm data-binding


    【解决方案1】:

    你错过了很多:)

    我相信您的 MyDataContext 扩展了 DbContext。 如果是这样,DbContext 应该是一个“工作单元”。 通常你:

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

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

    在 cmets 中,您说“我的属性现在设置为 DB 对象”。 它不是。它设置为最初由 EF 检索的对象,但 EF 在您处理 DbContext 的那一刻“忘记了它”。该对象仍然存在只是因为您仍在使用“book”变量引用它。

    【讨论】:

    • 如何将更新的对象正确推送回数据库?
    • DbContext.SaveChanges
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多