ManyToMany一边不是Null

时间:2017-05-16 18:56:43

标签: c# nhibernate fluent-nhibernate

我可以在NHibernate中定义多边关系,一边不是null吗? 我的示例类是:

public interface IUser
{
   int Id { get; set; }
   string Name { get; set; }
   IList<IGroup> Groups { get; set; }
}

public interface IGroup
{
   int Id { get; set; }
   string Name { get; set; }
   IList<IUser> Users { get; set; }
}

public class User : IUser
{
   public int Id { get; set; }
   public string Name { get; set; }
   public IList<IGroup> Groups { get; set; }
}

public class Group : IGroup
{
   public int Id { get; set; }
   public string Name { get; set; }
   public IList<IUser> Users { get; set; }
}

public class UserMap : ClassMap<User>
{
   public UserMap()
   {
      Id(x => x.Id).GeneratedBy.SequenceIdentity();
      Map(x => x.Name).Not.Null();
      HasManyToMany<Group>(x => x.Groups).Cascade.All();
   }
}

public class GroupMap : ClassMap<Group>
{
   public GroupMap()
   {
      Id(x => x.Id).GeneratedBy.SequenceIdentity();
      Map(x => x.Name).Not.Null();
      HasManyToMany<User>(x => x.Users).Cascade.All();
   }
}

使用此设置,我可以添加没有组的用户(Groups == null或空)和没有用户的组(Users == null或empty)。但我想要的是:    禁止添加没有组的用户    允许添加没有用户的组

我知道有关OneToMany关系的参考资料,但我不知道如何在ManyToMany关系中定义Not.Null(),我毫不怀疑如何仅为一方定义。

是否有可能或者我必须以编程方式检查?

1 个答案:

答案 0 :(得分:0)

不,映射不允许您约束模型以确保实体在其拥有的集合中始终至少有一个元素(无论是多对多还是一对多)。

因此,即使与中间关联实体交换多对多的两对一也无济于事。只有多对一或一对一可以要求另一端不为空。这里适用于单个相关实体,而不适用于相关实体的集合。

如果这有意义,您可以将一个“主要群组”映射为您的用户的多对一,并强制要求此主要群组。这当然会将用户的外键列添加到主组。

否则是的,您必须按代码检查该规则