2010-07-17 107 views
5

我们最近将我们的软件升级到.NET 4.0和EF 4.0(没有自我跟踪实体)(以前的.NET 3.5 SP1)。现在,前工作代码中出现了一个新的例外,我们不明白。EntityFramework 4.0:InvalidOperationExeception:违反多重约束

我们有一个名为Resident的实体,另一个名为ResidentExtension的实体,它使用1到(0/1)的关系扩展已经很大的Resident实体。下面的C#代码在我们的应用程序生成一个新的实体:

Residents resident = new Residents() 
    { 
     IsNewResident = true, 
     ResidentImage = Settings.Default.ResidentCardDefaultMaleImage, 
     IsActive = true, 
     ResidentCanBeDeleted = true, 
     ResidentExtensions = new ResidentExtensions(), 
     ResidentMasterDataState = EvoState.Error, 
     ResidentBasicDataState = EvoState.Error, 
     ResidentBenefactorsDataState = EvoState.Error, 
    }; 

以下异常这个说法后,直接提出:

多重约束侵犯。关系VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents'的角色'ResidentExtensions'具有多重性1或0..1。

它发生在生成的代码的setter方法:

[XmlIgnoreAttribute()] 
    [SoapIgnoreAttribute()] 
    [DataMemberAttribute()] 
    [EdmRelationshipNavigationPropertyAttribute("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel", "FK_ResidentExtensions_Residents", "ResidentExtensions")] 
    public ResidentExtensions ResidentExtensions 
    { 
     get 
     { 
      return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value; 
     } 
     set 
     { 
      ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value = value; 
     } 
    } 

我发现还没有唯一的办法是先提交驻地实体不带扩展名,并在此之后,与设置创建ResidentExtension外键(ResidentID)并将其添加到上下文并再次提交。但这不是它以前的工作方式。

有谁知道如何使这项工作再次以旧的方式?

+0

一月,你有没有解决这个问题的方式,你想它的工作? – 2011-03-22 18:15:52

+0

不幸的不是。仍然使用在我的问题的最后部分找到的解决方案;( – JanW 2011-03-28 11:03:53

回答

1
ResidentExtensions = new ResidentExtensions(), 

我觉得这条线根本不需要。您正在创建一个新的residentextensions对象,该对象没有任何主键,并且该对象不存在于数据库中。当上下文尝试保存residentextensions时,它不能设置属性,可能会导致数据库中与不可空字段相关的一些异常。我认为你需要做的是以下几点;

Residents resident = new Residents() 
    { 
     IsNewResident = true, 
     ResidentImage = Settings.Default.ResidentCardDefaultMaleImage, 
     IsActive = true, 
     ResidentCanBeDeleted = true, 
     ResidentMasterDataState = EvoState.Error, 
     ResidentBasicDataState = EvoState.Error, 
     ResidentBenefactorsDataState = EvoState.Error, 
    }; 
//Now you need to either initialize a residentextextensions entity 
// with proper values, or just do not relate it with the resident entity. 
ResidentExtensions temp = new ResidentExtensions(); 
temp.PropertyA = 3; 
//etc. 
resident.ResidentExtensions = temp; 

作为一个总结,由于居民实体与ResidentExtensions有1 - 0,1的关系;如果右边是0;只需将ResidentExtensions属性留空;否则请初始化一个合适的ResidentExtensions对象并设置相关的属性。

+0

据我所知,就上述示例而言,将ResidentExtensions对象分配给Residents导航属性会自动将ResidentExtensions对象上的外键设置为Residents对象的主键(它在EF <4.0中的工作方式)驻留扩展对象被正确初始化,因为它只包含外键(ResidentID)和可为空的属性PS:ResidentID是带自动增量的整数因此在提交实体与SaveChanges之前并不存在。 – JanW 2012-07-17 11:44:37