代码之家  ›  专栏  ›  技术社区  ›  Voice

EF 4.0更新异常

  •  2
  • Voice  · 技术社区  · 15 年前

    我有非常简单的POCO类结构,几乎没有依赖关系。每个POCO类都有一个具有属性ID的基本泛型类(EntityObject或ValueObect)。这个很简单,对象没有任何依赖关系。但是,当我使用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();                 
    

    那么,出现这种异常的原因是什么呢?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Ronald Wildenberg    15 年前

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

    StoreGeneratedPattern=“标识” 对于奖学金id和调查id。然后,我尝试了将项目添加到集合中并从集合中移除项目的常规代码,结果成功了!

    我能想到的只是这是EF4中的一个不应该出现的错误。解决这个问题的另一种方法是通过将桥表自身的标识添加到表中,使其成为对象。向右。希望这能帮助那些可怜的人。

    更新 Microsoft Connect report 关于这个问题。

        2
  •  0
  •   Voice    15 年前

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

      public class ValueList: EntityObject<Int32> {        
            public virtual MetaValue Name { get; set; }       
            public virtual IList<MetaValue> Values { get; set; }      
         }
    

    下面是元值类定义:

      public class MetaValue :
     EntityObject<Int32> {        
            public string Name { get; set; }       
             public virtual IList<CultureSpecificValue>
     CultureSpecificValues { get; set; }   
        }
    

    此项的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就没有了。此外,在从数据库分离并检索此对象之后,它的Values属性将填充一个value-listName和Name(Name和Values属性中的同一个对象)。那么,在edmx中又是一个问题,还是这样的结构(FK和manytomyne在同一个实体中)被EF误解了呢?