Frage

Ich habe ein Szenario, in einem System, das habe ich versucht, so gut wie möglich zu vereinfachen. Wir haben eine Tabelle (nennen wir sie) Artefakte können Artefakte, die durch eine beliebige Anzahl von Sicherheitsrollen und Sicherheitsrollen zugegriffen werden, um jede Anzahl von Artefakten zugreifen können. Als solche haben wir drei Tabellen in der Datenbank -. Eine Beschreibung von Artefakten, eine Beschreibung von Rollen und eine many-to-many-Zuordnungstabelle Artefakt-ID Role ID verknüpfen

Domain weise haben wir zwei Klassen - ein für eine Rolle und einen für einen Artefakt. die Artefakt-Klasse hat eine IList-Eigenschaft, die eine Liste von Rollen zurückgibt, die sie zugreifen können. (Rollen jedoch nicht bieten eine Eigenschaft Artefakte zu erhalten, auf die zugegriffen werden kann).

Als solche wird die Zuordnung für nhibernate Artefakt enthält die folgenden;

<bag name="AccessRoles" table="ArtefactAccess" order-by="RoleID" 
    lazy="true" access="field.camelcase-underscore" optimistic-lock="false">
    <key column="ArtefactID"/>
    <many-to-many class="Role" column="RoleID"/>
</bag>

Das alles funktioniert gut und wenn ich ein Artefakt löschen, wird die Zuordnungstabelle in geeigneter Weise und alle Verweise zwischen dem entfernten Artefakt und Rollen (die Rolle gelöscht wird nicht jedoch korrekt entfernt aufgeräumt - wie wir Waisen nicht wollen gelöscht).

Das Problem ist - wie eine Rolle zu löschen und hat klar automatisch die Zuordnungstabelle auf. Wenn ich jetzt versuchen, eine Rolle zu löschen, erhalte ich eine Referenz Einschränkung, da es noch Einträge in der Zuordnungstabelle für die Rolle ist. Der einzige Weg, um erfolgreich eine Rolle zu löschen ist für alle Artefakte abzufragen, die zu dieser Rolle verknüpfen, entfernen Sie die Rolle von der Rolle Sammlung des Artefakts, aktualisieren Sie die Artefakte und dann die Rolle löschen - nicht sehr effizient oder schön, vor allem, wenn sie in der un- vereinfachtes System, können Rollen mit einer beliebigen Anzahl von anderen Tabellen / Objekte zugeordnet werden.

Ich muss NHibernate andeuten können, dass ich diese Zuordnungstabelle wollen gelöscht, wenn ich eine Rolle löschen - ist dies möglich, und wenn ja - wie ich es tun tun

Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Da ich war auf der Suche für diese Antwort und fand diesen Thread auf Google (ohne Antwort) Ich dachte, ich meine Lösung zu diesem Beitrag würde. Mit drei Tabellen:. Die Rolle, RolesToAccess (ManyToMany), Zugang

Erstellen Sie die folgenden Zuordnungen: Zugang:

<bag name="Roles" table="RolesToAccess" cascade="none" lazy="false">
      <key column="AccessId" />
      <many-to-many column="AccessId" class="Domain.Compound,Domain" />
    </bag>

<bag name="RolesToAccess" cascade="save-update" inverse="true" lazy="false">
      <key column="AccessId" on-delete="cascade" />
      <one-to-many class="Domain.RolesToAccess,Domain" />
    </bag>

Rollen:

<bag name="Accesses" table="RolesToAccess" cascade="none" lazy="false">
      <key column="RoleId" />
      <many-to-many column="RoleId" class="Domain.Compound,Domain" />
    </bag>

<bag name="RolesToAccess" cascade="save-update" inverse="true" lazy="false">
      <key column="RoleId" on-delete="cascade" />
      <one-to-many class="Domain.RolesToAccess,Domain" />
    </bag>

Wie oben erwähnt Sie können die RolesToAccess Eigenschaften geschützt machen, damit sie Ihr Modell nicht verschmutzen.

Andere Tipps

Was Sie hier sagen:

  

Der einzige Weg, um erfolgreich eine Rolle zu löschen ist für alle Artefakte abzufragen, die zu dieser Rolle verknüpfen, entfernen Sie die Rolle von der Rolle Sammlung des Artefakts, die Artefakte aktualisieren und dann die Rolle löschen - nicht sehr effizient oder schön, vor allem, wenn sie in die nicht vereinfachten System, können Rollen mit einer beliebigen Anzahl von anderen Tabellen / Objekte zugeordnet werden.

ist nicht erforderlich. Angenommen, Sie wollen nicht die Zuordnungstabelle zuordnen (es ist ein Domain-Objekt machen), können Sie immer noch Löschungen durchführen sowohl mit minimalem Code endet.

Lassen Sie uns sagen, es gibt drei Tabellen: Die Rolle, Artifact und ArtifactAccess (der Link Tabelle). In Ihrem Mapping haben Sie nur Domänenobjekte für Rollen- und Artifact. Beide haben eine Tasche für den viel viele Vereinigung.

Rolle:

    <bag name="Artifacts" table="[ArtifactAccess]" schema="[Dbo]" lazy="true"
        inverse="false" cascade="none" generic="true">
        <key column="[ArtifactID]"/>

        <many-to-many column="[RoleID]" class="Role" />
    </bag>

Artifact:

    <bag name="Roles" table="[ArtifactAccess]" schema="[Dbo]" lazy="true"
        inverse="false" cascade="none" generic="true">
        <key column="[RoleID]"/>

        <many-to-many column="[ArtifactID]" class="Role" />
    </bag>

Wie Sie sehen können, beide Enden haben inverse = false angegeben. Die NHibernate Dokumentation empfiehlt Ihnen ein Ende des Vereins als ‚inverse‘ Ende zu wählen, aber nichts hindert Sie daran, sowohl mit als ‚herrschendes Ende‘. Wenn Aktualisierungen oder Einfügungen durchgeführt wird, funktioniert dies aus beiden Richtungen ohne Probleme. Wenn Löschungen von einem der beiden Enden durchführen, erhalten Sie einen Fehler FK Verletzung, da die Zuordnungstabelle nicht aktualisiert wird, wahr. Aber Sie können dieses Problem lösen, indem nur die Sammlung an das andere Ende löschen, bevor die Lösch Durchführung, die viel weniger komplex ist als das, was Sie tun, die in der ‚anderen‘ Ende des Vereins sucht, wenn es Verwendungen von ‚dies sind ' Ende. Wenn dies ein wenig verwirrend ist, hier ist ein Codebeispiel. Wenn Sie nur an einem Ende in der Kontrolle haben, für Ihre komplexen löschen Sie tun müssen:

foreach(var artifact in role.Artifacts)
    foreach(var role in artifact.Roles)
        if(role == roleToDelete)
            artifact.Roles.Remove(role)
    artifact.Save();
roleToDelete.Delete();

Was ich tun, wenn eine Rolle zu löschen ist so etwas wie

roleToDelete.Artifacts.Clear(); //removes the association record
roleToDelete.Delete(); // removes the artifact record

Es ist eine zusätzliche Zeile Code, aber auf diese Weise brauchen Sie nicht eine Entscheidung, auf dem Ende des Vereins zu machen, ist das inverse Ende. Sie brauchen auch nicht die Zuordnungstabelle für die volle Kontrolle zu kartieren.

Sie können eine Zuordnung für die Zuordnungstabelle machen, und rufen Sie dann auf die Tabelle löschen, wo der ROLE_ID der Wert ist, dass Sie im Begriff sind, zu löschen und führen Sie dann die Lösch der Rolle selbst. Sollte ziemlich einfach sein, dies zu tun.

Obwohl ich glaube, NHibernate eine Möglichkeit bieten muss, dies zu tun, ohne die Sammlung in den Rollen C # Klasse zu haben, können Sie dieses Verhalten in SQL immer gesetzt. Wählen Sie auf Kaskade löschen für die FK in der Datenbank und es sollte automatisch sein, nur achten Sie auf NHib Cache.

Aber ich Ihnen dringend empfehlen dies als letzter Ausweg verwendet werden.

Sie müssen eine Zuordnung von Rolle zu Artifact erstellen.

Sie können macht es faul-Laden, und wo es zu einem geschützten virtuellen Mitglied, so dass es nie wird tatsächlich zugegriffen, aber Sie müssen das Mapping für NHibernate es zu wissen, dass sie die Rollen aus der ArtefactAccess Tabelle löschen

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