Fluent NHibernate HasManyToMany entrambi i lati con carta noop
-
25-09-2019 - |
Domanda
Sto cercando di mappare un POCO come una relazione molti-a-molti. Non voglio una proprietà sul comportamento che contiene BehavioralEvents. Sono abbastanza sicuro che la mappatura molti-a-molti deve essere in entrambi i luoghi, ma non voglio che la proprietà corrispondente sulla mia classe Behavior.
ho sentito è possibile utilizzare un operatore di accesso no-op, ma non sono sicuro come farlo in Fluent NHibernate.
Si prega di avvisare:
public class BehavioralEvent : AggregateRoot
{
protected internal IList<Behavior> Behaviors { get; private set; }
public BehavioralEvent()
{
Behaviors = new List<Behavior>();
}
}
Comportamento Classe (di nuovo riferimento No per 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);
}
}
Soluzione
Non è necessario mappare da entrambi i lati.
Ho diverse mappature in questo modo:
HasManyToMany(x => x.SomeCollection).Table("MappingTable").ParentKeyColumn("ParentKey").ChildKeyColumn("ChildKey").Cascade.AllDeleteOrphan();
funziona come un fascino! Mappa come raccolta o un set (vedi http://www.codinginstinct.com/2010/03/nhibernate-tip-use-set-for-many-to-many.html ).
Altri suggerimenti
Se non è necessario dal comportamento allora non aggiungere nella mappatura. Se avete bisogno e non vogliono mettere il funzionamento quindi utilizzare Cascade.None ()