Nibernato fluente Hasmanytomany ambos os lados com mapa Noop
-
25-09-2019 - |
Pergunta
Estou tentando mapear um poco como um relacionamento de muitos para muitos. Não quero uma propriedade sobre comportamento que contenha comportamentalevents. Tenho certeza de que o mapeamento muitos para muitos deve estar em ambos os lugares, mas não quero a propriedade correspondente na minha aula de comportamento.
Ouvi dizer que você pode usar um operador de acesso sem opções, mas não tenho certeza de como fazê-lo no Nibernato Fluente.
Por favor informar:
public class BehavioralEvent : AggregateRoot
{
protected internal IList<Behavior> Behaviors { get; private set; }
public BehavioralEvent()
{
Behaviors = new List<Behavior>();
}
}
Classe de Comportamento (sem referência de volta ao Comportportalevent)
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(){}
}
Comportportaleventclassmap:
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");
}
}
Comportportclassmap:
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);
}
}
Solução
Você não precisa mapeá -lo de ambos os lados.
Eu tenho vários mapeamentos como este:
HasManyToMany(x => x.SomeCollection).Table("MappingTable").ParentKeyColumn("ParentKey").ChildKeyColumn("ChildKey").Cascade.AllDeleteOrphan();
Funciona como um encanto! Mapeá -lo como coleção ou conjunto (veja http://www.codinginstinct.com/2010/03/nhibernate-tip-use-set-for-many-to-many.html).
Outras dicas
Se você não precisar do comportamento, não adicione o mapeamento. Se você precisar e não quiser colocar a operação, use o cascade.none ()