代码之家  ›  专栏  ›  技术社区  ›  subirshan

SQL Server CE、实体框架和WinForms之间的简单连接

  •  2
  • subirshan  · 技术社区  · 10 年前

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

    我创建了一个名为 Customers 并添加了三列: Id , Name Age . 我已经设置了 身份证件 列作为主键,但未将其设置为标识列。

    然后,我添加了一个名为“ADO.NET实体数据模型” SampleEntities 。我选择了“从数据库生成”并选择 示例.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文件属性“复制到输出目录”设置为“如果更新则复制”。

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

    2 回复  |  直到 10 年前
        1
  •  2
  •   Dave Cousineau    10 年前

    问题是你的 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");
    

    你只需要打电话 接受所有更改 如果您拨打以下电话之一:

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

    当你打电话时 SaveChanges() ,(没有参数),“接受所有更改”将自动发生。

        2
  •  2
  •   Chris    10 年前

    如果您需要拨打 AcceptAllChanges 方法(1),则必须保存更改 之前 接受他们。

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

    这个 AcceptAllChanges 方法迭代ObjectStateManager中的所有ObjectStateEntry对象 补充 被改进的 ,然后将条目的状态设置为 未更改 这个 删除 项目将被分离。

    所以当你打电话的时候 SaveChanges 之后 接受所有更改 ,没有什么可挽救的。


    (1) 正如@Sahuagin所指出的,通常不需要调用 接受所有更改 方法如果你打电话 SaveChanges() 你不需要打电话 接受所有更改 完全

    只有在使用 SaveChanges(SaveOptions) 方法,而不指定 AcceptAllChangesAfterSave 在里面 SaveOptions .