Flunet Nhibernate all-delete-orphan不像预期的那样工作 [英] Flunet Nhibernate all-delete-orphan not working like expected

查看:163
本文介绍了Flunet Nhibernate all-delete-orphan不像预期的那样工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public class新闻:EntityBase 
{
public virtual DateTime CreationDate {get;组; }
公共虚拟IList< DomainNameToNews> DomainNameToNews {get;组; }
$ b public News()
{
DomainNameToNews = new List< DomainNameToNews>();



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

映射:

  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();
引用(x => x.News).UniqueKey(UQ_DOMAIN_NEWS)。Cascade.Delete();
引用(x => x.DomainName).UniqueKey(UQ_DOMAIN_NEWS);




$ <$> p>

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


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

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

解决方案

您需要在一对多集合关联中指定'inverse'。 b
$ b

  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();
参考文献(x => x.News).UniqueKey(UQ_DOMAIN_NEWS);
引用(x => x.DomainName).UniqueKey(UQ_DOMAIN_NEWS);




$ p
$ b $ p $在这个博客文章


I have following domain classes:

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; }
    }

Mapping:

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");
        }
    }

Explanation:

News can be used in different domains so DomainNameToNews is relationship between them. One news can be used by multiple domains.

Problem: What I want is to delete and add DomainToNews objects through News repository.

On update of News Object this object will have a list of DomainNameToNews so When I will update News the row from DomainNameToNews that will not be in this list I want to delete at all from database .Now the row that is not in this List will have Null News ,but I want to delete at all. How I must to map my object to achieve this? If I didn't explain myself enough clear please ask more details. Thnaks!!

解决方案

You need to specify 'inverse' at the one-to-many collection association.

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");
        }
    }

Explanation on 'inverse' in this blog post

这篇关于Flunet Nhibernate all-delete-orphan不像预期的那样工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆