2016-05-13 16 views
1

Ich habe Windows SmartClient Lösung von nHibernate 2.2 auf 4.0 aktualisiert und bekomme eine Ausnahme beim Schreiben in die Datenbank.Kann Objekt vom Typ 'System.Collections.ArrayList' nicht in Typ 'System.Collections.Generic.IEnumerable' eingeben

ist die Ausnahme in diesem Code ausgelöst:

this.session.Save(this.Location); // NHibernate.ISession 
tx.Commit(); // exception thrown here 

Die Ausnahme ist:

'System.InvalidCastException' in NHibernate.dll System.InvalidCastException: Kann Objekt vom Typ werfen 'System.Collections.ArrayList' , um 'System.Collections.Generic.IEnumerable' 1 [System.Object] 'einzugeben.

Es gibt mehrere Listen im Objekt gespeichert wird, ist hier ein paar repräsentative:

protected System.Collections.IList locationList; 
public virtual System.Collections.IList AssociatedLocationList 
{ 
    get 
    { 
     if (this.locationList == null) 
     { 
      this.locationList = new System.Collections.ArrayList(); 
     } 
     return this.locationList; 
    } 
    set { this.locationList = value; } 
} 
protected System.Collections.Generic.IList<Inspection> inspectionList; 
public virtual System.Collections.Generic.IList<Inspection> InspectionList 
{ 
    get 
    { 
     if (this.inspectionList == null) 
     { 
      this.inspectionList = new System.Collections.Generic.List<Inspection>(); 
     } 

     return this.inspectionList; 
    } 
    set { this.inspectionList = value; } 
} 

Beachten Sie, dass einige haben eine Art angegeben und manche nicht.

Ein Vorschlag here ist die Eigenschaft zu einem IList festgelegt, aber ich habe es bereits so.

Was kann getan werden?

+1

Haben Sie darüber nachgedacht, Generika zu verwenden? Das Umwerfen nackter Objekte scheint sehr ... 2003. –

+0

Ich fügte eine andere repräsentative Eigenschaft hinzu, die eine zum ursprünglichen Beitrag hat. Schlägst du vor, dass dies das Problem verursachen könnte? –

+0

Die Besetzung würde in einer generischen Version nicht mehr existieren. –

Antwort

2

Die Unterstützung für persistente nicht generische Sammlungen wurde in NHibernate 4.0 entfernt. Stattdessen in eine generische Sammlung konvertieren.

Siehe Liste der Änderungen in NHibernate 4.0 release notes.

1

Ich hoffe, ich verstehe Ihre Frage richtig und wenn ja, bin ich mir nicht sicher, ob Sie Ihren Null-Check überhaupt durchführen müssen. Stattdessen sollte Ihre Elternklasse eine Liste von Standorten enthalten, die vollständig in einer anderen Tabelle gespeichert sind.

Dies ist die Klasse, in der sich Ihre Standortliste befindet.

public class Parent 
{ 
    public virtual Guid Id { get; set; } 
    public virtual IList<Location> Locations { get; set; } 

    //This is the mapping for this class. 
    public class ParentMapping : ClassMap<Parent> 
    { 
     Id(x => x.Id).GeneratedBy.Guid(); 

     //This is what relates your location list to this parent. 
     //Notice that in the Location object below, 
     //there's a Owner property which will point back to here. 
     HasMany(x => x.Locations).Cascade.All(); 
    } 
} 

Und das ist die Klasse, die Ihre Standorte definiert.

public class Location 
{ 
    public virtual Guid Id { get; set; } 
    public virtual Parent Owner { get; set; } 
    public virtual string SomeProperty { get; set; } 

    //This is the mapping for this class. 
    public class LocationMapping : ClassMap<Location> 
    { 
     Id(x => x.Id).GeneratedBy.Guid(); 

     Map(x => x.SomeProperty); 

     //This will relate our property back to the parent. 
     References(x => x.Owner); 
    } 
} 
2

Das Problem könnte mit der neuesten Version von NHibernate ..i.e sein. 4.0

Sie haben folgende Optionen.

1) Die meiste Zeit, neue Version unterstützt Abwärtskompatibilität. Wenn dies der Fall ist, suchen Sie nach Überladungsversionen der iSession.Save-Methode. Sie können auch nicht-generisch werden.

2) Möglicherweise neue save-Methode unterstützt nur generischen Typ. Ihre ist nicht-generisch, d. H. ArrayList. Wenn Sie es in List <> ändern können, sollte das helfen.

3) Wenn Sie keine Kontrolle über Ilis haben, dann können Sie Konverter dazwischen schreiben, der Ihre Arraylist zu Illist <> konvertieren kann und es würde mit der Save-Methode funktionieren.

Hoffe, das hilft.

+0

Basierend auf dem, was Sie und @Robert Harvey gesagt haben, arbeite ich an # 2. Dies kann eine Weile dauern. Dieser Code ist 10 Jahre alt. –