2010-07-17 13 views
5

Abbiamo recentemente aggiornato il nostro software in .NET 4.0 e EF 4.0 (senza entità di auto-tracciamento) (precedente .NET 3.5 SP1). Ora una nuova eccezione viene sollevata nel precedente codice di lavoro, che non capiamo.EntityFramework 4.0: InvalidOperationExeception: Violazione della molteplicità violata

Abbiamo un'entità chiamata Resident e un'altra entità denominata ResidentExtension, che estende l'entità residente già grande con una relazione da 1 a (0/1). Il seguente codice C# genera una nuova entità nella nostra applicazione:

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

la seguente eccezione è direttamente sollevato dopo questa dichiarazione:

Molteplicità vincolo violato. Il ruolo 'ResidentExtensions' della relazione VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents 'ha molteplicità 1 o 0..1.

Essa si verifica nel setter del codice generato:

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

L'unica soluzione che ho ancora trovato è quello di sottoporre l'entità residente senza estensione prima, e dopo questo, creando un ResidentExtension con l'impostazione della chiave esterna (ResidentID) e aggiungerla al contesto e inviare nuovamente. Ma questo non è il modo in cui ha funzionato prima.

Qualcuno sa come rendere questo lavoro alla vecchia maniera?

+0

gen, hai mai risolto questo problema nel modo in cui volevi che funzionasse? –

+0

Purtroppo no. Sempre usando la soluzione che si trova nell'ultima parte della mia domanda ( – JanW

risposta

1
ResidentExtensions = new ResidentExtensions(), 

Penso che questa linea non sia affatto necessaria. Stai creando un nuovo oggetto residentextensions che non ha una chiave primaria e che non esiste nel database. Quando il contesto tenta di salvare residentextensions, non può poiché non è impostata alcuna proprietà, che potrebbe portare ad alcune eccezioni nel database relative ai campi non annullabili. Penso che quello che devi fare è il seguente;

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; 

In sintesi, in quanto soggetto residente ha 1 - 0,1 rapporto con ResidentExtensions; se il lato destro è 0; lascia nulla la proprietà ResidentExtensions; altrimenti inizializzare un oggetto ResidentExtensions appropriato e impostare la relativa proprietà.

+0

) Per quanto ne so, nel caso dell'esempio precedente, l'assegnazione dell'oggetto ResidentExtensions alla proprietà di navigazione Residents imposta automaticamente la chiave esterna sull'oggetto ResidentExtensions su la chiave primaria dell'oggetto Residents (cioè come ha funzionato in EF <4.0). L'oggetto di estensione residente è inizializzato correttamente, poiché contiene solo la chiave esterna (ResidentID) e le proprietà nullable. PS: ResidentID è un numero intero con incremento automatico e quindi non esistente prima di inviare l'entità con SaveChanges. – JanW

Problemi correlati