Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate多对多复合元素_C#_.net_Nhibernate - Fatal编程技术网

C# NHibernate多对多复合元素

C# NHibernate多对多复合元素,c#,.net,nhibernate,C#,.net,Nhibernate,我遇到了以下问题。在我的应用程序中,使用实体所有者和区域进行多对多绑定 public class Area : DomainObject<int> { private ISet<OwnersPeriod> _owners = new HashedSet<OwnersPeriod>(); public ICollection<OwnersPeriod> Owners { get { return _o

我遇到了以下问题。在我的应用程序中,使用实体
所有者
区域
进行多对多绑定

public class Area : DomainObject<int> {        
    private ISet<OwnersPeriod> _owners = new HashedSet<OwnersPeriod>();

    public ICollection<OwnersPeriod> Owners {
        get { return _owners; }
        set {
            Check.Require(value != null);
            _owners = new HashedSet<OwnersPeriod>(value);
        }
    }
}
因此对应于类OwnersPeriod

    public class OwnersPeriod {
        private Owner _member;
        private Area _area;    
        public Owner Owner { get {...} set{...} }    
        public Area Area { get { ... } set { ... } }    
        public  DateTime FirstDate { get; set; }    
        public  DateTime? LastDate { get; set; }       
    }
我写了映射

<class lazy="false" name="Core.Domain.Area, Core" table="Areas">
   ...
   <set name="Owners" table="Owner2Area" inverse="true" lazy="true" >
      <key column="IDArea"/>
      <composite-element class="Core.Domain.OwnersPeriod, Core" >
        <parent name="Area" />
        <property name="FirstDate" type="datetime"/>
        <property name="LastDate" type="datetime"/>
        <many-to-one name="Owner" class="Core.Domain.Owner, Core" column="IDOwner"/>
      </composite-element>
    </set>
</class>

...
对于每个区域,现有数据已成功加载到
Owners
,但当我通过
CreateSQLQuery
Owner2Area
中添加新记录时,这些数据不会针对该区域的实例进行更新。如果我重新打开表单并获得所有区域,则添加的链接将成功加载到集合中。
如何强制加载以记录多对多关系?

Nhibernate v.2.0.1,db MSSQL 2005

如果您使用CreateSQLQuery,Nhibernate不知道您做了什么。想一想。添加CreateSQLQuery是因为HQL和CriteriaQuery并非所有功能都可以实现。因此,使用CreateSQLQuery可以做“特殊的事情”

不推荐多对多,因为您没有“中间表”的“直接处理”。如果您以nhibernate的方式(修改集合)向多对多关系添加一个实体,然后对该实体进行更新,您将看到nhibernate从“中间表”中删除所有数据,然后再次插入它。不太好。这就是为什么您可能认为应该使用CreateSQLQuery来解决问题。 我建议您使用3个实体创建经典的父子关系,这样您就可以直接操作“中间表”

另一个解决方案是,当您更新“中间表”时,您对受CreateSQLQuery影响的实体执行逐出操作(这是ISession的一个方法,也是ISessionFactory中的一个方法,请查看手册)。但是使用它将迫使数据库再次命中(将加载新版本)。
使用父子方法不会对数据库造成影响。

谢谢。我注意到NH执行插入和删除记录。我添加了一个映射
inverse=“true”
,仅用于选择。用
execute
做我需要的事情来做决定。也许生活并没有教会我,但多对多的解决方案似乎很好
<class lazy="false" name="Core.Domain.Area, Core" table="Areas">
   ...
   <set name="Owners" table="Owner2Area" inverse="true" lazy="true" >
      <key column="IDArea"/>
      <composite-element class="Core.Domain.OwnersPeriod, Core" >
        <parent name="Area" />
        <property name="FirstDate" type="datetime"/>
        <property name="LastDate" type="datetime"/>
        <many-to-one name="Owner" class="Core.Domain.Owner, Core" column="IDOwner"/>
      </composite-element>
    </set>
</class>