2010-07-17 68 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