Frage

Ich habe folgende Tabellen und Entitäten, die fließend NHibernate zugeordnet werden müssen.

Tabellen: generasacodicetagpre.

Die Idee unter diesem Datenbankdesign ist wie folgt:

    .
  • A "Workarea" oder ein "Element" könnte mehrere "Anhang" -Dateien haben, und eine Datei "Anhang" kann über mehrere "Arbeitsbereiche" oder "Element" s verwiesen werden.

  • A "Workarea" oder ein "Element" könnte sich auf dieselbe "Anhang" -Datei beziehen.

    So werden die Beziehungen zwischen dem "Anhang" und "Workarea" oder "Element" s in "Objectattachment" gespeichert "Tabelle, in dem:

      .
    • "attachmentid" -Feld bezieht sich auf die Kennung eines bestimmten "Anhangs" s.

    • "AnhangsType-Feld (Diskriminator) definiert, ob diese Beziehung ist zwischen "Anlage" und "Workarea" oder zwischen "Anhang" S und "Element" s.

    • "ObjectID" -Feld bezieht sich auf den Kennung eines bestimmten "Arbeitsbereichs" oder "Elements" s, abhängig vom Wert des obigen "AnhangsType".

      Auf der Grundlage des Datenbankdesigns definiere ich dann Domänenmodellklassen wie folgt: generasacodicetagpre.

      Jetzt ist meine Frage, ob ich diese Domain-Modellklassen mit dem obigen Datenbankdesign zuordnen könnte. Wenn ja, wie könnte ich das tun? Wenn nein, wie ändere ich dann die Domain-Modellklassen, um das fließende NHibernate-Mapping gegen die konstruierte Datenbank zu unterstützen, da ich nicht das aktuelle Datenbankdesign ändern möchte (dh separate "Anhänge" -Tabellen für "Workarea" und "Element" erstellen). .

      grüße, Quan

War es hilfreich?

Lösung

public class AttachmentLink
{
     private Attachment _attachment;
     public virtual Attachment Parent
     {
          get { return _attachment; }
          set { _attachment = value; }
     }

     private IHasAttachments _linkedTo;
     public virtual IHasAttachments LinkedTo
     {
          get { return _linkedTo; }
          set { _linkedTo = value; }
     }
}

// in AttachmentMap
HasMany(x => x.Links)
    .Table("objectattachment");

// map the component
sealed class AttachmentLinkMap : ComponentMap<AttachmentLink>
{
    public AttachmentLinkMap()
    {
        References(x => x.Attachment, "attachmentid");
        ReferencesAny(x => x.LinkedTo)
            .IdentityType<Guid>()
            .EntityIdentifierColumn("objectid")
            .EntityTypeColumn("attachmenttype")
            .AddMetaValue<WorkArea>(typeof(WorkArea).Name.ToLower())
            .AddMetaValue<Element>(typeof(Element).Name.ToLower())
            .Not.LazyLoad();  // to prevent false proxies
    }
}


// in ElementMap, and almost the same in WorkAreaMap
HasManyToMany(x => x.Attachments)
    .Where("attachmenttype='element'")

Note: you don't need an Id column in the link table

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