Flunet Nhibernate all-delete-orphan不像预期的那样工作 [英] Flunet Nhibernate all-delete-orphan not working like expected
问题描述
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屋!