为什么导航属性在我的DataContext中执行更新时更新另一个实体? (C#实体框架)

时间:2011-12-22 19:16:23

标签: c# asp.net entity-framework entity-framework-4

我遇到了使用实体框架(EF)的情况,这让我完全陷入困境。我正在做一个简单的更新,我得到的错误是

违反PRIMARY KEY约束'PK__tblProducts_Mark__03E07F87'。无法在对象'healthc.tblProducts_MarketSegmentGroups'中插入重复键。 声明已经终止。

让我介绍一下这个问题。

我正在使用Web窗体并点击一下按钮事件以将一些数据保存在我页面上的多个文本框控件中。

我的数据库中有一个名为tblMetaProducts的表,这是一个用于存储我们使用的各个供应商的产品信息的表。该表的实体称为Products。

我还有另一个名为tblTechAssessment的表,其中包含有关供应商产品的技术问题的数据(例如,软件可运行的操作系统,版本号等)。此表的实体称为TechnicalAssessment。产品可以有许多技术评估,它们与产品ID相关。

我终于在数据库中有一个名为tblProducts_MarketSegmentGroups的查找表,它包含产品ID和另一个id(我们不关心这个问题)。该表的实体称为ProductMarketSegmentGroup。一个产品可以有许多产品细分市场组,并且它们与产品ID相关联。

EDMX Screen Shot

以下是我正在执行以执行EF保存的代码

private void UpdateTechnicalAssessments(int productID)
{
    var technicalAssessments = VendorDirectoryController.GetTechnicalAssessments(productID);
    var technicalAssessmentTypes = Enum.GetValues(typeof(TechnicalAssessmentType)).Cast<TechnicalAssessmentType>();
    foreach (var technicalAssessmentType in technicalAssessmentTypes)
    {
        var typeName = technicalAssessmentType.ToString();
        var id = "SaveToProduction" + typeName + "TextBox";
        var results = ProductInformationPanel.FindDescendantsByType<TextBox>().Single(x => x.ID == id).Text;
        technicalAssessments.Single(x => x.QuestionID == (int)technicalAssessmentType).Results = results;
    }

    VendorDirectoryController.SaveChanges();            
}

SaveChanges()方法向下钻取到我的域图层并调用dataContext.SaveChanges()方法。

所以我的问题是:

1)我该怎么做才能保存我的TechnicalAssessment实体? 2)为什么我的保存会影响ProductMarketSegmentGroup实体?

2 个答案:

答案 0 :(得分:1)

你可能会遇到EF的错误。我也发现类似的东西(即使我使用存储过程)。

解决方案是应用以下内容中提到的修补程序:hotfix: Principal entity in an SQL application generates unnecessary updates - do it still effect EF 4.3.1?

答案 1 :(得分:0)

我最终使用的解决方案是让我们的数据库管理员为更新创建一个proc。我无法弄清楚为什么导航属性会引起如此大惊小怪。