2010-07-17 14 views
5

Recientemente hemos actualizado nuestro software a .NET 4.0 y EF 4.0 (sin entidades de auto-seguimiento) (anteriormente .NET 3.5 SP1). Ahora se plantea una nueva excepción en el código de trabajo anterior, que no entendemos.EntityFramework 4.0: InvalidOperationExeception: restricción de multiplicidad violada

Tenemos una entidad llamada Residente, y otra entidad llamada ResidentExtension, que amplía la entidad residente ya de por sí con una relación de 1 a (0/1). El siguiente código C# genera una nueva entidad en nuestra aplicación:

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 siguiente excepción se lanza directamente después de esta declaración:

multiplicidad restricción violada. El rol 'ResidentExtensions' de la relación VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents 'tiene multiplicidad 1 o 0..1.

Ocurre en la incubadora del código generado:

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

La única solución que he encontrado todavía no ha presentado la entidad residente sin extensión en primer lugar, y después de esto, la creación de un ResidentExtension con el establecimiento de la clave externa (ResidentID) y agregarlo al contexto y enviar de nuevo. Pero esta no es la forma en que funcionó antes.

¿Alguien sabe cómo hacer que esto funcione a la vieja usanza otra vez?

+0

Jan, ¿Alguna vez resolvió este problema de la forma en que quería que funcionara? –

+0

Desafortunadamente no. Aún utilizando la solución que se encuentra en la última parte de mi pregunta; ( – JanW

Respuesta

1
ResidentExtensions = new ResidentExtensions(), 

Creo que esta línea no es necesaria en absoluto. Está creando un nuevo objeto residentextensions que no tiene ninguna clave principal y que no existe en la base de datos. Cuando el contexto intenta guardar las extensiones residente, no puede, ya que no se establece ninguna propiedad, lo que puede dar lugar a algunas excepciones en la base de datos relacionadas con campos que no admiten nulos. Creo que lo que debes hacer es lo siguiente;

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; 

Como resumen, ya que la entidad Residente tiene una relación 1 - 0,1 con ResidentExtensions; si el lado derecho es 0; simplemente deje la propiedad ResidentExtensions nula; de lo contrario, inicialice un objeto ResidentExtensions adecuado y establezca la propiedad relacionada.

+0

) Por lo que sé, en la cuestión del ejemplo anterior, la asignación del objeto ResidentExtensions a la propiedad de navegación de residentes establece automáticamente la clave externa en el objeto ResidentExtensions a la clave principal del objeto Residentes (así es como funcionaba en EF <4.0). El objeto de extensión residente está correctamente inicializado, ya que solo contiene la clave externa (ResidentID) y las propiedades que aceptan nulos. PS: ResidentID es un número entero con incremento automático y por lo tanto no existe antes de enviar la entidad con SaveChanges. – JanW

Cuestiones relacionadas