【问题标题】:Simple connection between SQL Server CE, Entity Framework, and WinFormsSQL Server CE、Entity Framework 和 WinForms 之间的简单连接
【发布时间】:2014-07-26 15:22:08
【问题描述】:

我创建了一个简单的表单,其中包含两个用于姓名和年龄的文本框,以及一个用于提交的按钮。我在名为Sample.sdf 的项目中添加了一个“本地数据库”。

我创建了一个名为Customers 的表并添加了三列:IdNameAge。 我已将Id 列设置为主键,但没有将其设置为标识列。

然后,我添加了一个名为SampleEntities 的“ADO.NET 实体数据模型”。我选择了“从数据库生成”并选择了Sample.sdf。我已经选择了表格并点击了完成。

在我完成的Button_Click 活动中:

using (SampleEntities se = new SampleEntities())
{
   Customer c = new Customer();
   c.Id = FindNextId();
   c.Age = Convert.ToDouble(txtAge.Text);
   c.Name = txtAge.Text;

   se.AddToCustomers(c);
   se.AcceptAllChanges();
   se.SaveChanges();
}
MessageBox.Show("Done");

我收到“完成”消息没有问题,但记录未显示在服务器资源管理器 - 客户表 - 显示表数据选项中。

注意:我知道在运行时,sdf 文件位于我的调试文件夹中。我正在检查项目目录中的 sdf 文件和调试文件夹中的 sdf 文件,都没有任何记录。此外,我已将我的 sdf 文件属性“复制到输出目录”设置为“如果较新则复制”。

所以我的问题是,客户行在哪里?

【问题讨论】:

    标签: c# winforms entity-framework sql-server-ce


    【解决方案1】:

    问题在于您的AcceptAllChanges 电话。你不需要调用它;只需致电SaveChanges

    using (SampleEntities se = new SampleEntities())
    {
       Customer c = new Customer();
       c.Id = FindNextId();
       c.Age = Convert.ToDouble(txtAge.Text);
       c.Name = txtAge.Text;
       se.AddToCustomers(c);
    
       se.SaveChanges();
    }
    MessageBox.Show("Done");
    

    如果您拨打以下任一电话,您只需拨打AcceptAllChanges

    • SaveChanges(false)
    • SaveChanges(SaveOptions.None)
    • SaveChanges(SaveOptions.DetectChangesBeforeSave)

    当您调用SaveChanges()(不带参数)时,“接受所有更改”会自动发生。

    【讨论】:

    • 你是对的!所以请告诉我 AcceptAllChanges 和 SaveChanges 有什么区别?当我使用每个?
    • @subirshan 在答案中做了一点解释。也请参阅 Chris 的回答,以及 this other question
    【解决方案2】:

    如果您需要调用AcceptAllChanges 方法(1),您必须在接受更改之前保存更改。

    se.SaveChanges();
    se.AcceptAllChanges();
    

    AcceptAllChanges 方法迭代 ObjectStateManager 中所有已添加已修改的 ObjectStateEntry 对象,然后将条目的状态设置为未更改。 Deleted 项被分离。

    所以当你在AcceptAllChanges 之后调用SaveChanges 时,没有什么可保存的。


    (1) 正如@Sahuagin 指出的,一般不需要调用AcceptAllChanges 方法。如果您致电SaveChanges(),则根本不需要致电AcceptAllChanges

    只有在使用SaveChanges(SaveOptions)方法时必须调用该方法,不要在SaveOptions中指定AcceptAllChangesAfterSave

    【讨论】:

    • 从我读到的here 我认为只有当你调用SaveChanges(false) 时才需要调用AcceptAllChanges。如果您调用SaveChanges() 或等效的SaveChanges(true),则根本不需要调用AcceptAllChanges
    • @Sahuagin 你是对的。但是请注意,SaveChanges(Boolean) 方法已过时
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多