【问题标题】:Entity Framework insert doesn't work实体框架插入不起作用
【发布时间】:2012-08-03 06:42:05
【问题描述】:

我有一个非常简单的带有实体框架的窗体项目。

我只是从“表单”中的“数据源”选项卡中拖动表格,它为我生成了一个“DataGridView”和一个“BindingSource”。

数据绑定成功,当我运行项目时,我可以看到“DataGridView”正确填充了数据,并且可以从“DataGridView”更新任何单元格值。

问题是我无法在“DataGridView”中插入任何行。

这是我写的一些代码,希望对解决问题有用:

    Teachers_DBEntities context = new Teachers_DBEntities();

    private void SaveItem_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
        MessageBox.Show("saved successfully");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        teachers_tableBindingSource.DataSource = context.teachers_table.ToList();
    }

为 cmets 更新

我测试了我的“BindingSource”,发现它成功理解了是否在“DataGridVeiw”中插入了新记录,但是当我调用context.savechanges();时,更改不会应用到数据库中

context.savechanges() 在我更新单元格时工作正常,但当我尝试在“DataGridView”中插入新记录时它不起作用。

在我的 edmx 文件中,我正确映射了所有列,主键 StoreGeneretedPattern 属性设置为 Identity,其 Entity Key 属性设置为 true。我的 SQL Server 数据库文件中的 auto-increment 属性设置为 true

感谢任何帮助。

【问题讨论】:

  • 您确定对象的身份 (pk) 尚未在数据库中吗?可以用 AddObject 等添加完整的代码吗?
  • 谢谢博阿斯的回复。我的 (pk) 是自动递增的,我没有为它输入任何值。我尝试使用 AddObject 在数据库中插入值,但问题是在“DataGridView”中添加新行完成时我不知道如何理解。
  • 你的桌子是空的吗?你已经用空桌子试过了吗?
  • 并且可以在保存更改之前检查验证错误吗?
  • 博阿斯,我更新了我的问题,并在其中回答了你的问题。

标签: c# .net entity-framework datagridview ado.net


【解决方案1】:

context.savechanges() 在我更新单元格时工作正常,但当我尝试在“DataGridView”中插入新记录时它不起作用。

“它不起作用”是什么意思?新记录没有出现在数据库中?当然不会。

在这一行

teachers_tableBindingSource.DataSource = context.teachers_table.ToList();

您正在破坏 DataSource 与上下文的连接。插入其中的任何新项目都不会插入teachers_table,而是插入您在其上创建的List

【讨论】:

  • 谢谢,有什么解决办法?如何在项目启动时填写我的DataGridView 而不会破坏DataSource
  • 我和 Masoud 有完全相同的问题,购买我在这里看不到解决方案。我完全理解问题的原因(插入重复列表而不是原始列表),但是......解决方案是什么?
【解决方案2】:
using (var context = new YourEntities ()) 
{
     var dpt = new yourObject { Name = "Test" };
     context.yourObject.Add(dpt);
     context.SaveChanges(); 
}

您缺少在上下文中添加对象

【讨论】:

  • 感谢您的回复。是否可以将“DataGridView”绑定到上下文?我的意思是每当我在“DataGridView”上下文中插入新行时都会自动添加新对象。如果没有,那么我如何理解何时在“DataGridView”中完成了新行添加来为其编写代码?
【解决方案3】:

在 .Net 4.5 中,当我删除 ToList() 时出现此错误:

不支持数据绑定到商店查询。

而是用数据填充 DbSet,例如通过在 DbSet 上调用 Load,然后绑定到本地数据。

【讨论】:

    【解决方案4】:

    我也遇到了同样的问题。经过很多小时,我终于找到了自己的解决方案......

    我正在使用 C#、.Net Framework、Entity Framework 6.4

    如果我设置

    teachers_tableBindingSource.DataSource = context.teachers_table.ToList();
    

    数据在 DB 中更新但未插入。

    如果我设置(按照建议)

    teachers_tableBindingSource.DataSource = context.teachers_table;
    

    我得到错误:

    System.NotSupportedException HResult=0x80131515 Mensaje = 数据 直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery、 不支持 DbRawSqlQuery)。而是用数据填充 DbSet, 例如通过在 DbSet 上调用 Load,然后绑定到本地数据。 对于 WPF 绑定到 DbSet.Local。对于 WinForms 绑定到 DbSet.Local.ToBindingList()。对于 ASP.NET WebForms,您可以绑定到 在查询上调用 ToList() 或使用模型绑定的结果,更多 信息见http://go.microsoft.com/fwlink/?LinkId=389592

    最后我得到了这个提示的答案:

    context.teachers_table.Load(); //Load records in this DataSet<>
    
    teachers_tableBindingSource.DataSource = context.teachers_table.Local.ToBindigngList();
    

    现在可以了。数据在数据库中被正确删除、插入和更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多