首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF 4.0 UpdateException

EF 4.0 UpdateException
EN

Stack Overflow用户
提问于 2010-02-15 23:36:20
回答 2查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
 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();                 

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

EN

回答 2

Stack Overflow用户

发布于 2010-02-24 08:30:09

我想我找到了这种问题的原因。我的EF图中有一个多对多的情况(奖学金表,测量表,ScholarshipSurvey表{这是一个桥接表})。经过一番认真的自我反省后,我在EDMX的ScholarshipSurvey表条目中发现了这个:

代码语言:javascript
复制
    <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

票数 3
EN

Stack Overflow用户

发布于 2010-02-16 17:07:25

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

代码语言:javascript
复制
  public class ValueList: EntityObject<Int32> {        
        public virtual MetaValue Name { get; set; }       
        public virtual IList<MetaValue> Values { get; set; }      
     }

下面是MetaValue类的定义:

代码语言:javascript
复制
  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测试如下所示:

代码语言:javascript
复制
 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以某种方式误解了?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2266984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档