2010-07-17 17 views
5

Wir haben unsere Software kürzlich auf .NET 4.0 und EF 4.0 (ohne Self-Tracking-Entities) (früher .NET 3.5 SP1) aktualisiert. Jetzt gibt es eine neue Ausnahme im früheren Arbeitscode, die wir nicht verstehen.EntityFramework 4.0: InvalidOperationExeception: Multiplikationsbedingung verletzt

Wir haben eine Entität namens Resident und eine andere Entität namens ResidentExtension, die die bereits große residente Entität mit einer Beziehung von 1 zu (0/1) erweitert. Der folgende C# Code generiert eine neue Einheit in unserer Anwendung:

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

Die folgende Ausnahme unmittelbar nach dieser Anweisung ausgelöst wird:

Multiplicity Einschränkung verletzt. Die Rolle 'ResidentExtensions' der Beziehung VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents 'hat Multiplizität 1 oder 0..1.

Es tritt in dem Setter des generierten Codes:

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

Die einzige Lösung, die ich gefunden habe noch ist Resident-Einheit ohne Verlängerung einreicht ersten und danach ein ResidentExtension Erstellung mit der Einstellung Fremdschlüssel (ResidentID) und fügt es dem Kontext hinzu und reicht es erneut ein. Aber so hat es früher nicht funktioniert.

Weiß jemand, wie man diese Arbeit wieder auf die alte Art und Weise machen kann?

+0

Jan, hast du dieses Problem jemals so gelöst, wie du es haben wolltest? –

+0

Leider nicht. Ich benutze immer noch die Lösung, die im letzten Teil meiner Frage gefunden wird; ( – JanW

Antwort

1
ResidentExtensions = new ResidentExtensions(), 

Ich denke, diese Zeile wird überhaupt nicht benötigt. Sie erstellen ein neues Objekt residentextensions, das keinen Primärschlüssel besitzt und nicht in der Datenbank vorhanden ist. Wenn context versucht, die residentextensions zu speichern, kann dies nicht geschehen, da keine Eigenschaft festgelegt ist, was möglicherweise zu einigen Ausnahmen in der Datenbank führen kann, die sich auf nicht nullbare Felder beziehen. Ich denke, was Sie tun müssen, ist folgendes;

Als Zusammenfassung, da Resident Entity hat 1 - 0,1 Beziehung mit ResidentExtensions; wenn die rechte Seite 0 ist; Lassen Sie die ResidentExtensions-Eigenschaft einfach null; andernfalls initialisieren Sie ein ordnungsgemäßes ResidentExtensions-Objekt und legen Sie die zugehörige Eigenschaft fest.

+0

) Soweit ich weiß, setzt das ResidentExtensions-Objekt bei der Zuweisung der Resident-Navigationseigenschaft automatisch den Fremdschlüssel für das ResidentExtensions-Objekt auf der primäre Schlüssel des Residents-Objekts (so funktionierte es in EF <4.0) Das residente Erweiterungsobjekt ist ordnungsgemäß initialisiert, da es nur die Eigenschaften Fremdschlüssel (ResidentID) und Nullable enthält PS: ResidentID ist Integer mit automatischem Inkrement und daher nicht vorhanden, bevor die Entität mit SaveChanges übergeben wird. – JanW

Verwandte Themen