已成功提交对数据库的更改,但更新对象时发生错误 - 已修订

时间:2014-01-16 23:24:38

标签: entity-framework sql-server-ce

我在Visual Basic(VS2010)中使用带有SQL Compact Edition 4.0的.NET V4.0中的EF。我们正在构建一组简单的表单来维护一些表。一个表'Companies'链接到另外两个表(People,CalibrationInfo),其中Companies作为父表。实体类型定义是:
< EntityType Name =“Company”>
          <文件>
            <摘要>提供公司和送货地址列表。< / Summary>
          < /文档和GT;
          <钥匙及GT;
            < PropertyRef Name =“CompanyID”/>
          < / Key与GT;
          < Property Name =“CompanyID”Type =“Int32”Nullable =“false”注释:StoreGeneratedPattern =“Identity”/>
          < Property Name =“Name”Type =“String”MaxLength =“100”Unicode =“true”FixedLength =“false”Nullable =“false”/>
          < Property Name =“Address1”Type =“String”MaxLength =“100”Unicode =“true”FixedLength =“false”/>

          < Property Name =“Address2”Type =“String”MaxLength =“100”Unicode =“true”FixedLength =“false”/>

          < Property Name =“Address3”Type =“String”MaxLength =“100”Unicode =“true”FixedLength =“false”/>

          < Property Name =“Telephone”Type =“String”MaxLength =“30”FixedLength =“false”Unicode =“true”/>

          < Property Name =“PrimaryContactID”Type =“Int32”a:GetterAccess =“Public”xmlns:a =“http://schemas.microsoft.com/ado/2006/04/codegeneration”a:SetterAccess =“Public” Nullable =“true”>
            <文件>
              <摘要>该公司主要联系人的可选主要联系人ID。< / Summary>
            < /文档和GT;
          < /性>
          < Property Name =“Disabled”Type =“Boolean”Nullable =“false”DefaultValue =“false”/>

          < NavigationProperty Name =“Calibrations”Relationship =“NWCUDataStoreModel.FK_CalibrationInfo_Company”FromRole =“Companies”ToRole =“CalibrationInfo”/>
          < NavigationProperty Name =“PrimaryContact”Relationship =“NWCUDataStoreModel.FK_Company_PrimaryContact”FromRole =“Company”ToRole =“Person”/>
< /&的EntityType GT;

表单使用在上下文中设置的公司的绑定源:
    bsCompanies = ctx.Companies.OrderBy(“it.Name”)

绑定源链接到导航栏。按BindingNavigatorAddNewItem按钮可创建新记录。我只将公司名称标签输入到下一个字段,然后按“保存”按钮。主要联系人的链接设置为空,因此此记录没有其他关系。 “保存”按钮执行以下操作:
    RowsSaved = ctx.SaveChanges()
这会生成InvalidOperationException。内部例外是:
AcceptChanges无法继续,因为对象的键值与另一个对象冲突...

数据库中没有其他记录名称设置为“Test”。该异常表示记录已保存,但无法接受更改。该记录仍标记为已添加。在此错误之后调用ctx.AcceptChanges会生成异常。

如果我是直接在代码中执行此操作,而不是在表单上使用BindingSource,它实际上看起来像这样:
    昏暗的公司作为新公司
    company.Name = “测试”
    company.PrimaryContactID =什么都没有     ctx.Companies.Add(公司)
    ctx.Save

我在multipe网站上查看了其他示例,并应用了我能找到的任何修复程序,包括将PrimaryContact id直接设置为正确的Person记录ID并将PrimaryContact设置为Nothing。没有任何区别。

我还从模型中删除了三个表,然后重新加载它们。没有区别。

我在SQL Server中使用了相同的代码而没有任何问题,但似乎没有任何东西可以与SQL Compact版本V4.0一起使用。您会认为将单个记录存储到表中应该不那么困难。如果我们必须回到数据集,我需要做很多重新编码。

任何建议或见解表示赞赏。 谢谢,尼尔

1 个答案:

答案 0 :(得分:0)

BTW,答案是使用Nuget下载Entity Framework 6.0,Entity Framework SQL Server Compact和Microsoft SQL Server Compact 4.0。然后我下载了EF Framework 5 DB Generator .tt文件,因为EF 6版本在Visual Studio 2010中不起作用。您可以从添加代码生成菜单项执行此操作,并选择在线模板 - > EF 5 DBContext Generator ...最后,我使用这篇Microsoft文章修改了文件:Databinding with WinForms。在那之后,事情开始奏效。没有上述更改,EF 4.0不能与开箱即用的SQL Server Compact一起使用。使用本文中描述的ObservableListSource类也有助于表单上的父子关系,这在我切换到此类之前不起作用。