我在 VS 2010 RC 中使用 EF 4.0。 我有非常简单的 POCO 类结构,几乎没有依赖项。每个 POCO 类都有一个带有属性 ID 的基本通用类(EntityObject 或 ValueObect)。我有几个 CRUD 测试,但只有其中一个有效。这个非常简单,对象没有任何依赖关系。但是,当我使用 FK 依赖项测试某些内容时,我总是会遇到相同的错误:System.Data.UpdateException:在多个位置生成跨实体或关联共享的值。检查映射是否不会将 EntityKey 拆分为多个存储生成的列。 我已经用谷歌搜索过,但我发现这个异常的唯一原因是使用了几个上下文,这不是我的情况。
using (IEntityModelContext context = new EFDataContext()) {
var licTypeFact = context.GetFactory<LicenceType>();
var metaValFact = context.GetFactory<MetaValue>();
var cultSpecFact = context.GetFactory<CultureSpecificValue>();
LicenceType licType = licTypeFact.CreateObject();
Assert.IsNotNull(licType);
Assert.IsTrue(licType.IsTransient);
licType.AdvancedFeatureSet = true;
licType.BasicFeatureSet = true;
licType.MaxUsers = 10;
licType.MonthDuration = 1;
MetaValue licTypeName = metaValFact.CreateObject();
licTypeName.Name = "TestLicType";
CultureSpecificValue licNameEng = cultSpecFact.CreateObject();
licNameEng.Value = "Test Licence";
licNameEng.Culture = context.CultureRepository.Load(cult => cult.Name == "Eng");
licNameEng.MetaValue = licTypeName;
licTypeName.CultureSpecificValues = new List<CultureSpecificValue>();
licTypeName.CultureSpecificValues.Add(licNameEng);
licType.Name = licTypeName;
licType.NumberOfQuestionsPerSurvey = 1;
licType.NumberOfResponsesPerSurvey = 2;
licType.NumberOfSurveys = 3;
licType.PerUserPrice = 10;
licType.Price = 100;
context.LicenceTypeRepository.Add(licType);
int res = context.SaveChanges();
那么这个异常的原因可能是什么?
最佳答案
K.我想我找到了此类问题的原因。我的 EF 图中存在多对多的情况(Scholarhip 表、Survey 表、ScholarshipSurvey 表{这是一个桥接表})。经过一番认真的 self 反省后,我在 EDMX 的奖学金调查表条目中发现了这一点:
<EntityType Name="ScholarshipSurvey">
<Key>
<PropertyRef Name="ScholarshipID" />
<PropertyRef Name="SurveyID" />
</Key>
<Property Name="ScholarshipID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="SurveyID" Type="int" Nullable="false" StoreGeneratedPattern="Identity"/>
</EntityType>
我就想,不行啊!为什么EF要制定这些“身份”?它们不在数据模型中。因此,当我使用 XML 编辑器(而不是默认的双击)打开 EDMX 时,我删除了奖学金 ID 和调查 ID 的条目 StoreGeneratePattern="Identity"。然后,我尝试了将项目添加到集合中并从集合中删除项目的常规代码,它成功了!
我所能想到的是,这是 EF4 中不应该出现的错误。解决此问题的唯一其他方法是通过向表添加自己的标识来使桥接表成为对象。哎呀。希望这可以帮助一些可怜的灵魂。
更新 (rwwilden):有一个 Microsoft Connect report对于这个问题。
关于.net - EF 4.0 更新异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2266984/