首页 文章

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

提问于
浏览
0

我在Visual Basic(VS2010)中使用带有SQL Compact Edition 4.0的.NET V4.0中的EF . 我们正在构建一组简单的表单来维护一些表 . 一个表'Companies'链接到另外两个表(People,CalibrationInfo),其中Companies作为父表 . 实体类型定义是:
<EntityType Name = "Company">
<文档>
<摘要>提供公司和送货地址列表 . </ Summary>
</文档>
<密钥>
<PropertyRef Name = "CompanyID" />
</密钥>
<Property Name = "CompanyID" Type = "Int32" Nullable = "false" annotation: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>
</文档>
</属性>
<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>

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

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

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

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

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

我还从模型中删除了三个表,然后重新加载它们 . 没有不同 .

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

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

1 回答

  • 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类也有助于表单上的父子关系,这在我切换到此类之前不起作用 .

相关问题