Fließend NHibernate: Wie kartieren Sie viele zu viele Beziehungen zu Diskriminator?
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
-
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