2 Stimmen

Breeze + NHibernate Many-To-One Relation, Vermeiden Sie die Notwendigkeit, Beziehungsschlüssel anzugeben

Die folgende Many-to-One-Zuordnung funktioniert (übernommen von NorthBreeze):

public partial class UserRole
{
    public virtual long ID { get; set; }
    public virtual long UserId { get; set; }
    public virtual long RoleId { get; set; }

    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

Wie kann ich diese Art von Many-to-One-Zuordnung zum Laufen bringen (ohne UserId und RoleId-Eigenschaften im Modell zu spezifizieren):

public partial class UserRole
{
    public virtual long ID { get; set; }

    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

Fehlermeldung: Konnte kein passendes Fremdschlüssel-Feld für die Eigenschaft Models.NorthwindIB.NH.UserRole.User finden

Kann dies in zukünftigen Versionen von BreezeJs auf irgendeine Weise behandelt werden, oder gibt es derzeit einen Weg, dies zu tun, ohne diese Schlüssel im Modell selbst angeben zu müssen? Oder ist mehr daran, als ich sehe?

EDIT (inoffizielle Lösung): Vielen Dank, dass Sie uns in die richtige Richtung geleitet haben. Da dies etwas war, das wir erledigt haben wollten, haben wir einige Modifikationen basierend darauf vorgenommen, was Steve Schmitt gesagt hat.

Hier ist ein Link zu den Änderungen, damit Sie sehen können, wie wir dieses Problem gelöst haben und es anderen helfen kann. (Bitte beachten Sie, dass dieser Code nur für NHibernate funktioniert)

https://github.com/maca88/Breeze/commit/7a80c35cf0b20b5cffdef6d2eddeccd1bdeb3735

1voto

Steve Schmitt Punkte 3124

Nein, aber wir planen, das zu beheben. Das Problem, wie du und Rippo gelernt habt, ist dass die FKs auf dem Client für Breeze erforderlich sind, um zu funktionieren. Sie sind auch erforderlich, um die Entitäten auf dem Server während der SaveChanges-Verarbeitung wieder zu verbinden.

Unser Gedanke (bisher unversucht) ist:

  1. Die erforderlichen Fremdschlüssel-Eigenschaften in den Metadaten zu erstellen, wo sie im realen Modell nicht existieren. Diese würden irgendwie als "synthetisch" markiert sein (z. B. '$' Präfix, spezielle Eigenschaft, etc).
  2. Während des JSON-Serialisierungsprozesses die synthetischen Fremdschlüssel aus den zugehörigen Entitäten oder NH-Proxies zu befüllen.
  3. Während des JSON-Deserialisierungsprozesses (beim Speichern) die synthetischen Fremdschlüsselinformationen zusammen mit der Entität zu übermitteln, damit sie verwendet werden können, um Beziehungen neu herzustellen oder NH-Proxies zu erstellen.

Keine triviale Übung. Wir sind uns bewusst, dass es wichtig ist für Entwickler, die bestehende N/Hibernate-Modelle haben und sie nicht ändern möchten, um Breeze zu verwenden.

0voto

Rippo Punkte 21266

Ich habe NorthBreeze heruntergeladen und mir schnell angesehen. Breeze hat einen Begriff von einer FK-Map und ich vermute, dass die FKs benötigt werden, um Entitäten zu verknüpfen.

Laut den Dokumenten...

Breeze-Assoziationen erfordern Fremdschlüssel.

Dies bedeutet, dass alle Fremdschlüssel in Breeze freigelegt werden müssen, um die Navigation/das Abrufen von verwandten Entitäten zu ermöglichen. In Ihrem Beispiel ermöglicht es Breeze wahrscheinlich, Benutzer und ihre zugehörigen Rollen aufzulisten.

Das NHibernate-Mapping für diese Fremdschlüssel verhindert, dass diese Schlüssel direkt geändert werden. Daher würde ich das Mapping so belassen, da es keine spürbare Auswirkung auf den Code-Bestand haben wird.

Breeze-Metadaten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X