我在VS2010RC中使用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(); 那么,这种异常的原因是什么呢?
发布于 2010-02-24 08:30:09
我想我找到了这种问题的原因。我的EF图中有一个多对多的情况(奖学金表,测量表,ScholarshipSurvey表{这是一个桥接表})。经过一番认真的自我反省后,我在EDMX的ScholarshipSurvey表条目中发现了这个:
<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>我在想,不可能!为什么英孚要做出这些“身份”。它们不在它们来自的数据模型中。因此,当我使用XML编辑器打开EDMX时(而不是默认的双击),我删除了奖学金id和调查id的条目StoreGeneratedPattern="Identity"。然后,我试着用我的普通代码将项添加到集合中,并从集合中删除项,它起作用了!
我所能想到的就是这是EF4中的一个本不应该存在的错误。解决此问题的唯一另一种方法是将桥接表作为对象,将其自身的标识添加到该表中。哎呀。希望这能帮助一些可怜的灵魂。
更新 (rwwilden):有针对此问题的Microsoft Connect report。
发布于 2010-02-16 17:07:25
然而,在重新创建edmx之后,最初的问题已经消失,又出现了另一个问题。我有一个定义如下的类:
public class ValueList: EntityObject<Int32> {
public virtual MetaValue Name { get; set; }
public virtual IList<MetaValue> Values { get; set; }
}下面是MetaValue类的定义:
public class MetaValue :
EntityObject<Int32> {
public string Name { get; set; }
public virtual IList<CultureSpecificValue>
CultureSpecificValues { get; set; }
}ValueList中的Values属性表示ValueLists和MetaValues表之间的多对多关系(使用两个FK列和两个PK列连接表ValueListMetaValues )。此项目的CRUD测试如下所示:
using (IEntityModelContext context =
new EFDataContext()) {
var valueListFact = context.GetFactory<ValueList>();
ValueList newValList = valueListFact.CreateObject();
Assert.IsNotNull(newValList);
Assert.IsTrue(newValList.IsTransient);
var metaValFact = context.GetFactory<MetaValue>();
var cultSpecFact = context.GetFactory<CultureSpecificValue>();
MetaValue listName = metaValFact.CreateObject();
MetaValue valOne = metaValFact.CreateObject();
MetaValue valTwo = metaValFact.CreateObject();
listName.Name = "list";
valOne.Name = "One";
valTwo.Name = "Two";
newValList.Name = listName;
newValList.Values = new List<MetaValue>() { valOne, valTwo
};
context.ValueListRepository.Add(newValList);
context.SaveChanges();因此,在context.SaveChanges()之后,listName被保存,而valOne和valTwo没有被保存。此外,在从DB分离和检索该对象后,它的值propety被填充一个值- listName和名称(在名称和值属性上相同的对象)。那么,是edmx中的问题再次出现,还是这样的结构( FK和manyTomany在同一实体中)被EF以某种方式误解了?
https://stackoverflow.com/questions/2266984
复制相似问题