Fluent NHibernate HasManyToMany beide Seiten mit noop Karte
-
25-09-2019 - |
Frage
Ich versuche, eine POCO als viele-zu-viele-Beziehung zu kartieren. Ich will nicht eine Eigenschaft auf Verhalten, das BehavioralEvents enthält. Ich bin ziemlich sicher, dass das Many-to-Many-Mapping hat in beiden Orten sein, aber ich habe nicht die entsprechende Eigenschaft auf meinem Verhalten Klasse will.
Ich habe gehört, dass Sie einen no-op-Zugriffsoperator verwenden können, aber im nicht sicher, wie es in Fluent NHibernate zu tun.
Bitte raten:
public class BehavioralEvent : AggregateRoot
{
protected internal IList<Behavior> Behaviors { get; private set; }
public BehavioralEvent()
{
Behaviors = new List<Behavior>();
}
}
Verhaltensklasse (Kein Rückgriff auf BehavioralEvent)
public class Behavior : AggregateRoot
{
protected internal virtual string Name { get; private set; }
protected internal virtual string Definition { get; private set; }
public Behavior(string name, Guid id)
{
this.Id = id;
this.Name = name;
}
protected Behavior(){}
}
BehavioralEventClassMap:
public class BehavioralEventClassMap : ClassMap<BehavioralEvent>
{
public BehavioralEventClassMap()
{
Id(x => x.Id, "BehavioralEventId").GeneratedBy.Assigned();
HasManyToMany(x => x.Behaviors)
.Cascade.All()
.Table("BehaviorData")
.ParentKeyColumn("BehavioralEventId")
.ChildKeyColumn("BehaviorId");
}
}
BehaviorClassMap:
public class BehaviorClassMap : ClassMap<Behavior>
{
public BehaviorClassMap()
{
Table("Behaviors");
Id(x => x.Id, "BehaviorId").GeneratedBy.Assigned();
Map(x => x.Name).Not.Nullable();
Map(x => x.Definition);
}
}
Lösung
Sie müssen nicht von beiden Seiten abzubilden.
Ich habe verschiedene Zuordnungen wie folgt aus:
HasManyToMany(x => x.SomeCollection).Table("MappingTable").ParentKeyColumn("ParentKey").ChildKeyColumn("ChildKey").Cascade.AllDeleteOrphan();
Arbeiten wie ein Charme! Wo es als Sammlung oder Set (siehe http://www.codinginstinct.com/2010/03/nhibernate-tip-use-set-for-many-to-many.html ).
Andere Tipps
Wenn Sie von Verhalten nicht brauchen, fügen Sie dann nicht in Abbildung. Wenn Sie brauchen und wollen nicht, den Betrieb setzen dann verwenden Cascade.None ()