Frage an c#, nhibernate – NHibernate: Fehler beim Dehydrieren von Eigentum - Was zum Teufel ist das?

18

Ich führe eine ziemlich komplexe NHibernate-Transaktion in einem Finanzsystem durch, erstelle eine Zahlung, zeichne die Buchungen auf und überprüfe, ob die Zahlung der Gesamtbetrag einer Rechnung ist. Wenn ja, markiere ich die Rechnung als vollständig bezahlt usw. viele lustige Sachen. Natürlich muss dies in einer einzigen Transaktion geschehen.

Wenn ich versuche, die Änderung für die Sitzung zu übernehmen, wird die folgende Fehlermeldung angezeigt:

Error dehydrating property value for C3.DataModel.CFAPTransaction.Vendor

Googeln dies hat nicht viele Rekorde aufgetaucht. Kann mir jemand sagen, was dies bedeutet und worauf ich mich beim Debuggen konzentrieren muss?

AKTUALISIEREN

Auf Anfrage hier die vollständige Fehlermeldung:

NHibernate.PropertyValueException: Error dehydrating property v  alue for C3.DataModel.CFAPTransaction.Vendor --->

NHibernate.HibernateException: Eigenschaft kann nicht aufgelöst werden: APVendorId bei NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex (String propertyName) bei NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValueers.EntityEntist (Objekt) GetPropertyValue (Object obj, String propertyName, EntityMode entityMode) bei NHibernate.Type.EntityType.GetIdentifier (Object value, Sitzung ISessionImplementor) bei NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand st, Object value, Index] session) at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Object [] -Felder, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) - - Ende der inneren Ausnahmestapel-Ablaufverfolgung --- bei NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Objekt [] -Felder, Objekt-Zeilen-ID, Boolea n [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Objekt-ID, Objekt [] -Felder, Boolean [] notNull, Int32 j , SqlCommandInfo sql, Object obj, ISessionImplementor-Sitzung) bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Objekt-ID, Object [] -Felder, Object obj, ISessionImplementor-Sitzung) bei NHibernate.Action.EntityInsertAction.Execute (). ActionQueue.Execute (IExecutable executable) bei NHibernate.Engine.ActionQueue.ExecuteActions (IList list) bei NHibernate.Engine.ActionQueue.ExecuteActions () bei NHibernate.Event.Default.AbstractFlushingEventListener.PerformEx DefaultFlushEventListener.OnFlush (FlushEvent-Ereignis) bei NHibernate.Impl.SessionImpl.Flush () bei NHibernate.Transaction.AdoTransaction.Commit () bei C3.DataModel.Repositories.NHUnitOfWork.Save () in C: \ projects \ Ca \ taModel.Generated \ Generated \ NHibernateRepositories.generated.cs: Zeile 2659 in C3.WebUI.Areas.Finance.Controllers.AccountsPayableController.CreatePayment (CreatePaymentModel-Modell) in C: \ projects \ C3 \ C3.WebUI \ Areas \ Finance \ Controllers \ AccountsPayableController.cs: Zeile 434

AKTUALISIEREN Wenn ich NHibernate in den DEBUG-Modus versetze, bekomme ich ein paar Sachen wie diese:

Verarbeitungskaskade NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction für: C3.DataModel.APVendor-Kaskade NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction für Sammlung: C3.DataModel.APVendor.Transactions done APVendor.Transactions-Verarbeitungskaskade NHibernate.Engine.CascadingAction + SaveUpdateCascadingAction für: C3.DataModel.APVendor NHibernate.Event.Default.AbstractFlushingEventListener ERROR Konnte den Datenbankstatus mit der Sitzung NHibernate.PropertyFlushingEigenschaft nicht synchronisieren. Vendor ---> NHibernate.HibernateException: Die Eigenschaft APVendorId kann nicht aufgelöst werden .Entity.AbstractEntityPersister.GetProp ertyValue (Object obj, String propertyName, EntityMode entityMode) bei NHibernate.Type.EntityType.GetIdentifier (Object value, ISessionImplementor-Sitzung) bei NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand-St, Object value, Int32-Index B, festlegbar) session) at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Object [] -Felder, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) - - Ende der inneren Ausnahmestapel-Ablaufverfolgung --- bei NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Object [] -Felder, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Objekt-ID, Object [] -Felder, Boolean [] notNull, Int32 j, SqlCommandInfo-SQL, Object obj, ISessionImplementor-Sitzung) bei NHiberna te.Persister.Entity.AbstractEntityPersister.Insert (Objekt-ID, Objekt [] -Felder, Objektobjekt, ISessionImplementor-Sitzung) bei NHibernate.Action.EntityInsertAction.Execute () bei NHibernate.Engine.ActionQueue.Execute (IExecutable Executable) bei NHibine .ActionQueue.ExecuteActions (IList-Liste) bei NHibernate.Engine.ActionQueue.ExecuteActions () bei NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource-Sitzung) C3.WebUI.Areas.Finance.Controller. Finance.Controllers.AccountsPayableController: Keine zusätzlichen Informationen. NHibernate.PropertyValueException: Fehler beim Dehydratisieren des Eigenschaftswerts für C3.DataModel.CFAPTransaction.Vendor ---> NHibernate.HibernateException: Eigenschaft kann nicht aufgelöst werden: APVendorId bei NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyName.Entible .AbstractEntityTuplizer.GetPropertyValue (Objektentität, String propertyPath) bei NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue (Objektobjekt, String propertyName, EntityMode entityMode) bei NHibernate.Type.EntityType .ManyToOneType.NullSafeSet (IDbCommand st, Objektwert, Int32-Index, Boolean [] einstellbar, ISessionImplementor-Sitzung) bei NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Object [] -Felder, Object rowId, Boolean, Boolean [] includeP [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Object [] -Felder, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) at NHibernate.Pers .Entity.AbstractEntityPersister.Insert (Objekt-ID, Objekt [] -Felder, Boolean [] notNull, Int32 j, SqlCommandInfo sql, Objekt obj, ISessionImplementor-Sitzung) bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Objekt-ID, Objekt [] , Object obj, ISessionImplementor session) bei NHibernate.Action.EntityInsertAction.Execute () bei NHibernate.Engine.ActionQueue.Execute (IExecutable executable) bei NHibernate.Engine.ActionQueue.ExecuteActions (IList list) bei NHibue.ExecuteAuteActions (IList ) um NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource-Sitzung) um NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (FlushEvent-Ereignis) um NHibernate.Impl.SessionImpl.Flush () um NHib nate.Transaction.AdoTransaction.Commit () um C3.DataModel.Repositories.NHUnitOfWork.Save () in C: \ projects \ C3 \ C3.DataModel.Generated \ Generated \ NHibernateRepositories.generated.cs: Zeile 2659 um C3.WebUI. Areas.Finance.Controllers.AccountsPayableController.CreatePayment (CreatePaymentModel-Modell) in C: \ projects \ C3 \ C3.WebUI \ Areas \ Finance \ Controllers \ AccountsPayableController.cs: Zeile 434

Es scheint nicht, dass dies beim Abfragen der Datenbank auftritt. Ich habe das Gefühl, dass es Probleme gibt, wenn ich eine Reihe von Objekten erstelle, sie in Beziehung setze und dann versuche, sie beizubehalten, aber das ist eine reine Vermutung.

Welche Version von NHibernate ist das? In NH 2.0 gibt es verschiedene Probleme mit dem Linq-Anbieter und verschiedenen Mapping-Typen (dh Komponenten). Michael Baker
Dies ist 3.2, nicht fließend. Jeremy Holovacs
Was ist die vollständige Ausnahme und gibt es eine innere Ausnahme? Preet Sangha
wie wäre es mitEigenschaft kann nicht aufgelöst werden: APVendorId - Gibt dir das einen Hinweis? Ist die Zuordnung falsch? DasNHUnitOfWork.Save() versucht, in eine Spalte zu schreiben, und sucht nach einer Eigenschaft mit dem Namen APVendorId. Preet Sangha

Deine Antwort

4   die antwort
3

als wollten Sie für jede Transaktion einen Lieferanten angeben. In diesem Fall muss Ihr Mapping dem folgenden Code entsprechen.

public CFAPTransactionMap()
{
  HasOne(x => x.Vendor).ForeignKey("VendorId").Cascade.All();
  ...
}
14

dass nhibernate nicht die richtige Fehlereigenschaft anzeigt. Überprüfen Sie die angrenzenden Eigenschaften in der Zuordnungsdatei und suchen Sie nach Fehlern in der Beziehung zwischen Datentypen aus Ihrer Datenbank und Datentypen aus .net oder wiederholten Spalten in Eigenschaften VerknüpfungFließendes NHibernate - IndexOutOfRange

Dies ist anscheinend passiert. Ich hatte einen Tippfehler in einer anderen Eigenschaft und ich denke, es hat sich auf diese ausgewirkt. Ich hätte kein Problem damit, außer dass die Nachricht so verdammt kryptisch war. Jeremy Holovacs
Ähm ... nein, wenn man sich das 6 Jahre später ansieht, ist es immer noch kryptisch und eine schreckliche Fehlermeldung. Jeremy Holovacs
Es ist nicht kryptisch - schauen Sie sich nur die innere Ausnahme in den von Ihnen eingefügten Informationen an. Piotr Szmyd
1

dnungen:

ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); });
Property(x => x.intPersonID, map => map.Column("PersonID"));

Wenn ich versucht habe, dies in meiner Datenbank zu speichern, indem ich nur die Eigenschaft ausgefüllt habeintPersonID und machen dieobjPerson null, dies löst den Dehydrierungsfehler bei all Ihren Eigenschaften aus!

Der Grund, warum ich nur bevölkereintPersonID soll verhindern, dass auf der Datenbank abgefragt wird, um dieobjPerson vor dem Speichern in die Datenbank. Leider wird es einen Fehler auslösen, so dass ich meine Zuordnungen geändert und mit diesem korrigiert habe:

ManyToOne(x => x.objPerson, map => { map.Column("PersonID"); map.NotNullable(false); });

Oder wenn ich verhindern möchte, dass die Datenbank abgefragt wird, indem das gesamte Objekt abgerufen wird, verwende ich stattdessen einfach diese Zuordnung:

Property(x => x.intPersonID, map => map.Column("PersonID"));

Eine Kombination ist jedoch nicht möglich.

In meinem Fall musste ich die übergeordnete Entität ohne das untergeordnete Element beibehalten, sodass das Hinzufügen des ReadOnly-Flags des 1: 1-Teils der Beziehung wie folgt funktioniert hat:stackoverflow.com/a/33253799/97471 Gerardo Grignoli
2

Einfaches Objekt:

public class Employee
{
    public virtual int ID { get; set; }
}

Kartierung:

publi,c class EmployeeMap : ClassMapping<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.ID, map => { map.Generator(Generators.Identity); map.UnsavedValue(0); });
    }
}

SQL:

Hier ist die ID-Spalte mit der Primärschlüsseleinschränkung.

Und hier sehen Sie die fehlende Identitätsangabe, die das Problem verursacht.

Um das Problem zu lösen, müssen Sie die ID-Spalte als angebenIDENTITY d.h.

CREATE TABLE EMPLOYEE
(
    ID int NOT NULL IDENTITY(0, 1)
);
Wow, das habe ich auch verpasst, danke! =) Frerk Morrin

Verwandte Fragen