Fluido Nhibernate HasManyToMany ambos lados con un mapa noop
-
25-09-2019 - |
Pregunta
Estoy intentando asignar a poco como una relación de muchos a muchos. No quiero una propiedad en el comportamiento que contiene BehavioralEvents. Estoy bastante seguro de que muchos-a-muchos mapeo tiene que estar en ambos lugares, sin embargo, no quiero la propiedad correspondiente en mi clase de comportamiento.
He oído puede utilizar un operador de acceso no-op pero no estoy seguro de cómo hacerlo en Fluido Nhibernate.
Por favor consejo:
public class BehavioralEvent : AggregateRoot
{
protected internal IList<Behavior> Behaviors { get; private set; }
public BehavioralEvent()
{
Behaviors = new List<Behavior>();
}
}
comportamiento de la clase (de nuevo referencia a No 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);
}
}
Solución
No es necesario hacer un mapa de ambos lados.
Tengo varias asignaciones de la siguiente manera:
HasManyToMany(x => x.SomeCollection).Table("MappingTable").ParentKeyColumn("ParentKey").ChildKeyColumn("ChildKey").Cascade.AllDeleteOrphan();
funciona como un encanto! Asignarla como colección o un conjunto (ver http://www.codinginstinct.com/2010/03/nhibernate-tip-use-set-for-many-to-many.html ).
Otros consejos
Si no necesita de comportamiento, entonces no añadir en la cartografía. Si necesita y no quieren poner a continuación, utilizar la operación Cascade.None ()