Flunet Nhibernate all-delete-orphan不能像预期的那样工作

时间:2014-03-13 13:23:41

标签: c# fluent-nhibernate fluent-nhibernate-mapping

我有以下域类:

public class News: EntityBase
    {
        public virtual DateTime CreationDate { get; set; }
        public virtual IList<DomainNameToNews> DomainNameToNews { get; set; } 

        public News()
        {
            DomainNameToNews=new List<DomainNameToNews>();           
        }
    }

public class DomainNameToNews : EntityBase
    {
        public virtual DomainName DomainName { get; set; }
        public virtual News News { get; set; }
    }

映射:

public class NewsMap : ClassMap<News>
    {
        public NewsMap()
        {
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.CreationDate).Not.Nullable();
            HasMany(x => x.DomainNameToNews).Cascade.AllDeleteOrphan();
        }
    }
 public class DomainNameToNewsMap : ClassMap<DomainNameToNews>
    {
        public DomainNameToNewsMap()
        {
            Id(x => x.Id).GeneratedBy.Identity();
            References(x => x.News).UniqueKey("UQ_DOMAIN_NEWS").Cascade.Delete();
            References(x => x.DomainName).UniqueKey("UQ_DOMAIN_NEWS");
        }
    }

解释

新闻可以在不同的域中使用,因此DomainNameToNews是它们之间的关系。一个新闻可以被多个域使用。

问题: 我想要的是通过新闻库删除和添加DomainToNews对象。

在更新新闻对象时,这个对象将有一个DomainNameToNews列表,所以当我更新新闻时,DomainNameToNews中不会出现在此列表中的行我想要从数据库中删除。现在不在此的行列表将有Null News,但我想删除。我如何映射我的对象来实现这一目标? 如果我没有足够清楚地解释自己,请询问更多细节。 Thnaks !!

1 个答案:

答案 0 :(得分:1)

您需要指定&#39;反向&#39;在一对多收藏协会。

public class NewsMap : ClassMap<News>
    {
        public NewsMap()
        {
            Id(x => x.Id).GeneratedBy.Identity();
            Map(x => x.CreationDate).Not.Nullable();
            HasMany(x => x.DomainNameToNews).Inverse.Cascade.AllDeleteOrphan();
        }
    }
 public class DomainNameToNewsMap : ClassMap<DomainNameToNews>
    {
        public DomainNameToNewsMap()
        {
            Id(x => x.Id).GeneratedBy.Identity();
            References(x => x.News).UniqueKey("UQ_DOMAIN_NEWS");
            References(x => x.DomainName).UniqueKey("UQ_DOMAIN_NEWS");
        }
    }

&#39;反向&#39;在此blog post