当前位置:  开发笔记 > Android > 正文

NHibernate没有持久的多对多关系

如何解决《NHibernate没有持久的多对多关系》经验,为你挑选了2个好方法。

我目前正在使用NHibernate作为我的数据访问层,使用Fluent NHibernate为我创建映射文件.我有两个类,TripItem和TripItemAttributeValue,它们之间有多对多的关系.

映射如下:

public class TripItemMap : ClassMap
{
    public TripItemMap()
    {
        WithTable("TripItemsInt");
        NotLazyLoaded();

        Id(x => x.ID).GeneratedBy.Identity().WithUnsavedValue(0);
        Map(x => x.CreateDate, "CreatedOn").CanNotBeNull();
        Map(x => x.ModifyDate, "LastModified").CanNotBeNull();

        /* snip */

        HasManyToMany(x => x.Attributes).AsBag()
            .WithTableName("TripItems_TripItemAttributeValues_Link")
            .WithParentKeyColumn("TripItemId")
            .WithChildKeyColumn("TripItemAttributeValueId")
            .LazyLoad();
    }
}

public class TripItemAttributeValueMap : ClassMap
{
    public TripItemAttributeValueMap()
    {
        WithTable("TripItemAttributeValues");

        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name).CanNotBeNull();

        HasManyToMany(x => x.TripItems).AsBag()
            .WithTableName("TripItems_TripItemAttributeValues_Link")
            .WithParentKeyColumn("TripItemAttributeValueId")
            .WithChildKeyColumn("TripItemId")
            .LazyLoad();
    }
}

在我的应用程序中的某个时刻,我从数据库中获取现有属性,将它们添加到tripItem.Attributes,然后保存tripItem对象.最后,TripItems_TripItemAttributeValues_Link永远不会获得任何新记录,从而导致关系不被持久化.

如果有帮助,这些是Fluent NHibernate为这些类生成的映射文件:



  
    
      
    
    
      
    
    
      
    
    
      
      
    
  



  
    
      
    
    
      
    
    
      
      
    
  

我在这做错了什么?



1> Emmanuel..:

@efdee

我遇到了同样的问题,花了将近两天的时间.我有很多关系,链接表也没有更新.我是NHibernate的新手,只是想学习它,所以把我说的一切都拿出来.

好吧,事实证明它不是流畅的NHibernate,也不是映射,但我不理解NHibernate如何与多对多一起工作.在多对多关系中,如果未填充两个实体上的集合,则NHibernate不会将数据持久保存到链接表.

假设我将这些实体与多对多关系:

partial class Contact
{
   public string ContactName {get; set;}
   public IList Locations {get; set;}

}

partial class Location
{
   public string LocationName {get; set;}
   public string LocationAddress {get;set;}
   public IList Contacts {get;set;}
}

当我向Contact.Locations添加一个位置时,我必须确保该联系人也存在于location.Contacts中.

所以要添加一个位置我在我的Contact类中有这个方法.

public void AddLocation(Location location)
        {
            if (!location.Contacts.Contains(this))
            {
                location.Contacts.Add(this);
            }
            Locations.Add(location);
        }

这似乎解决了我的问题,但就像我说我只是拿起NHibernate并学习它,可能有更好的方法.如果有人有更好的解决方案,请发布.

这是指向我检查两个集合的帖子:http://www.coderanch.com/t/217138/Object-Relational-Mapping/link-table-of-ManyToMany-annotation



2> 小智..:

调用Session.Flush()或使用事务.


任何人都可以解释为什么我们需要在这种情况下这样做?
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有