2010-07-17 12 views
5

Yazılımımızı yakın zamanda .NET 4.0 ve EF 4.0'a (kendini izleme varlıkları olmadan) (eski .NET 3.5 SP1) güncelleştirdik. Şimdi, eski çalışma kodunda, anlamadığımız yeni bir istisna ortaya çıkıyor.EntityFramework 4.0: InvalidOperationExeception: Çarpıklık kısıtlaması ihlal edildi

Yerleşik olarak adlandırdığımız ve zaten büyük olan Yerleşik öğeyi 1 ile (0/1) arasındaki ilişkiyi uzatan bir başka varlığımız olan ResidentExtension adlı bir kuruluşumuz var. Aşağıdaki C# kodu bizim uygulamada yeni bir varlık oluşturur:

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, 
    }; 

şu istisna doğrudan bu ifadesinden sonra yükseltilir:

Çokluk kısıtlaması ihlal etti. VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents 'ilişkisinin' ResidentExtensions 'rolünün çokluğu 1 veya 0.1'dir.

O oluşturulan kodun setter oluşur: ayar ile ResidentExtension yaratarak

[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; 
     } 
    } 

henüz bulduk tek çözüm birinci uzantısı olmadan Yerleşik varlık sunacak ve bundan sonra yabancı anahtar (ResidentID) ve içeriğe ekleyerek tekrar gönderin. Ama bu daha önce çalıştığı şekilde değil.

Bu işi eski haline nasıl döndüreceğini bilen var mı?

+0

Jan, bu sorunu sizin istediğiniz şekilde çözdünüz mü? –

+0

Ne yazık ki değil. Sorunun son bölümünde bulunan çözümü kullanarak hala ( – JanW

cevap

1
ResidentExtensions = new ResidentExtensions(), 

Bu hattın hiç gerekmediğini düşünüyorum. Herhangi bir birincil anahtara sahip olmayan ve veritabanında bulunmayan yeni bir residentextensions nesnesi oluşturuyorsunuz. Bağlam, residentextensions'ı kurtarmaya çalıştığında, null olmayan bir alanla ilgili veritabanında bazı istisnalara yol açacak bir özellik belirlenemediğinden bu mümkün değildir. Bence yapmanız gereken şey; Özet olarak

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; 

, Yerleşik işletme 1 beri - ResidentExtensions 0,1 ilişkisi; sağ taraf 0 ise; sadece ResidentExtensions özelliğini boş bırakın; aksi halde uygun bir ResidentExtensions nesnesini başlatıp ilgili özelliği ayarlayın.

+0

Bildiğim kadarıyla, yukarıdaki örnekte, ResidentExtensions nesnesini Residents navigasyon özelliğine atamak, otomatik olarak yabancı tuşunu ResidentExtensions nesnesine ayarlar. Yerleşikler nesnesinin birincil anahtarı (yani EF <4.0'da çalıştığı gibi) Yerleşik uzantı nesnesi, yalnızca yabancı anahtar (ResidentID) ve null özelliklerinden oluştuğu için düzgün bir şekilde başlatılır. PS: ResidentID, otomatik artışla tamsayıdır. ve bu nedenle varlığı SaveChanges ile göndermeden önce mevcut değildir. – JanW