.net EF 4.0更新异常

.net EF 4.0更新异常,.net,entity-framework,visual-studio-2010,.net,Entity Framework,Visual Studio 2010,我在VS 2010 RC中使用EF 4.0。 我有非常简单的POCO类结构,几乎没有依赖项。每个POCO类都有一个属性ID为的基本泛型类(EntityObject或ValueObect)。在对象没有任何依赖项的情况下,这一点非常简单。但是,当我使用FK依赖项测试某些东西时,我总是得到相同的错误:System.Data.UpdateException:在多个位置生成跨实体或关联共享的值。检查映射是否未将EntityKey拆分为多个存储生成的列。 我已经在谷歌上搜索过了,但我发现这个异常的唯一原因是

我在VS 2010 RC中使用EF 4.0。 我有非常简单的POCO类结构,几乎没有依赖项。每个POCO类都有一个属性ID为的基本泛型类(EntityObject或ValueObect)。在对象没有任何依赖项的情况下,这一点非常简单。但是,当我使用FK依赖项测试某些东西时,我总是得到相同的错误:System.Data.UpdateException:在多个位置生成跨实体或关联共享的值。检查映射是否未将EntityKey拆分为多个存储生成的列。 我已经在谷歌上搜索过了,但我发现这个异常的唯一原因是使用了几个contextes,这与我的情况不同

 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();                 
使用(IEntityModelContext=new EFDataContext()){
var licTypeFact=context.GetFactory();
var metaValFact=context.GetFactory();
var cultSpecFact=context.GetFactory();
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=“测试许可证”;
licNameEng.Culture=context.CultureRepository.Load(cult=>cult.Name==“Eng”);
licNameEng.MetaValue=licTypeName;
licTypeName.CultureSpecificValues=新列表();
licTypeName.CultureSpecificValues.Add(licNameEng);
licType.Name=licTypeName;
licType.NumberOfQuestionsPerSurvey=1;
licType.numberofresponsepersurvey=2;
licType.NumberOfSurveys=3;
licType.PerUserPrice=10;
价格=100;
context.LicenceTypeRepository.Add(licType);
int res=context.SaveChanges();

那么这个异常的原因是什么呢?

然而,在重新创建edmx之后,最初的问题消失了,又出现了一个问题。我有一个类,它的定义如下:

  public class ValueList: EntityObject<Int32> {        
        public virtual MetaValue Name { get; set; }       
        public virtual IList<MetaValue> Values { get; set; }      
     }
 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();
公共类值列表:EntityObject{
公共虚拟元值名称{get;set;}
公共虚拟IList值{get;set;}
}
这里是元值类定义:

  public class MetaValue :
 EntityObject<Int32> {        
        public string Name { get; set; }       
         public virtual IList<CultureSpecificValue>
 CultureSpecificValues { get; set; }   
    }
公共类元值:
EntityObject{
公共字符串名称{get;set;}
公共虚拟图书馆
CultureSpecificValues{get;set;}
}
ValueList中的Values属性表示ValueList和MetaValues表之间的多对多关系(将表ValueListMetaValues与两个FK列和PK连接在一起)。 此项的积垢测试如下所示:

  public class ValueList: EntityObject<Int32> {        
        public virtual MetaValue Name { get; set; }       
        public virtual IList<MetaValue> Values { get; set; }      
     }
 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();
使用(IEntityModelContext)上下文=
新建EFDataContext()){
var valueListFact=context.GetFactory();
ValueList newValList=valueListFact.CreateObject();
Assert.IsNotNull(newValList);
Assert.IsTrue(newValList.IsTransient);
var metaValFact=context.GetFactory();
var cultSpecFact=context.GetFactory();
MetaValue listName=metaValFact.CreateObject();
MetaValue valOne=metaValFact.CreateObject();
MetaValue valTwo=metaValFact.CreateObject();
listName.Name=“list”;
valOne.Name=“一”;
valTwo.Name=“Two”;
newValList.Name=listName;
Values=newlist(){valOne,valTwo
};  
context.ValueListRepository.Add(newValList);
SaveChanges();

因此,在context.SaveChanges()listName被保存后,valOne和valTwo不会被保存。此外,在从DB中分离和检索此对象后,其Values属性将填充一个值-listName和名称(名称和值属性中的同一对象)。edmx或类似结构中的问题也是如此(FK和许多人在同一个实体中)不知何故被EF?

K误解。我想我找到了这类问题的原因。我的EF图中有一个多对多的情况(学术表、调查表、学术调查表{这是一个桥梁表}).经过认真的自我反省之后,我在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>

我在想,不可能!为什么EF会创建这些“标识”。它们不在数据模型中,而这些标识来自于数据模型。因此,当我使用XML编辑器(而不是默认的双击)打开EDMX时,我删除了条目StoreGeneratedPattern=“Identity”对于奖学金id和调查id。然后,我尝试了将项目添加到集合中并从集合中删除项目的常规代码,结果成功了

我所能想到的是,这是EF4中不应该出现的一个错误。解决这个问题的唯一其他方法是通过在表中添加自己的标识来将桥接表变成一个对象。天啊。希望这能帮助一些可怜的人


更新(rwwilden):此问题有一个解决方案。

这里没有显示大量自定义代码,我强烈怀疑存在错误。我建议删除间接层并仅使用上下文。错误将消失。然后重新添加间接层,直到错误再次出现。Thanx Craig。我重新生成了edmx,此问题已消失。pr问题仍然存在。顺便说一句,我的存储库类是围绕IObjectSet接口和fac的简单包装