Frage

Unsere Organisation ist auf der Suche auf Entity Framework standardisieren einmal v4 herauskommt. Im Ergebnis ist mir schauen, was es dauern würde, unsere Anwendung zu migrieren, die NHibernate für Persistenz EF4 mit POCO-Unterstützung verwendet. In einigen Stellen verwenden wir einzelne Tabelle Vererbung (auch als Tabelle pro Hierarchie bekannt). Ich war nicht in der Lage, es zu erhalten mit dem folgenden zu arbeiten.

Zahlung (Basisklasse [sollten abstrakt sein, aber Probleme, auch dort]) CreditCardPayment (konkrete Umsetzung) ACHPayment (konkrete Umsetzung) CheckPayment (konkrete Umsetzung)

Im Moment bin ich Abbilden sie nur mit den Basisklasse Eigenschaften. Alle diese Klassen sind im gleichen Namensraum. Sie haben eine discrimimator die PaymentTypeId in der Datenbank aufgerufen wird, so dass die Zahlungszuordnung hat eine Bedingung „Wenn PaymentTypeId = 0“. Jede der Unterklassen hat die gleichen Bedingungen mit unterschiedlichen Werten (d.h. CreditCardPayment = 1, usw.).

Wenn ich versuche, die jeweils eine Liste aller Zahlungen zu laden mit DataContext.Payments.ToList () (Datacontext erbt von Object) Ich erhalte die folgende Ausnahme:

„Objektzuordnung konnte nicht für Typen mit Identität‚DataLayer.DataModel.CreditCardPayment‘gefunden werden.“

ich kann nicht herausfinden, was das bedeutet, wie die POCO CreditCardPayment Klasse im gleichen Namensraum lebt wie die POCO Zahlungsklasse hat (in der Tat in der gleichen Datei).

Was bin ich?

War es hilfreich?

Lösung 2

Was ich vorher nicht vertreten (ich glaube es nicht relevant, aber es ist). War das CreditCardPayment von einem Zwischenklasse geerbt Namen „CreditPayment“ und ACHPayment geerbt von CashPayment. CreditCardPayment und CashPayment leben im gleichen Namensraum und Datei, wurden aber in dem EF-Mapping nicht vertreten. Sobald ich die innerhalb der Mapping-Datei hinzugefügt, funktionierte alles ok.

Also, auch dachte EF immer nicht direkt zu einem dieser Typen zuzuordnen, so scheint es zu brauchen, um über sie wissen, weil es die Basetype der CreditCardPayment Klassen et al ändert. Vielen Dank für Ihre Hilfe zu diesem Thema.

Andere Tipps

Dies ist nicht beschweren über Datenbank-Mapping, sondern Modell CLR-Mapping.

Das EF kann aus irgendeinem Grunde nicht Ihre CreditCardPayment Klasse finden.

Jetzt ein möglicher Grund ist, dass Sie nicht die Metadaten für sie noch geladen haben.

Zum Beispiel, wenn Sie dies:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment

Wenn Sie dann das EF Abfrage nicht weiß, wo CreditCardPayment lebt.

Die Art und Weise, dies zu umgehen ist mit LoadAssembly heißt:

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}

Sie müssen sagen, jede Baugruppe LoadFromAssembly, die nicht direkt von Ihrer DataContext Klasse verweisen wird.

. Hinweis: typeof(Payment).Assembly direkt wegen der IQueryable<Payment> Zahlungen Eigenschaft verweist

Hope, das hilft

Alex

Microsoft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top