如何在流畅的nhibernate中覆盖约定的级联规则

时间:2009-04-01 08:45:36

标签: fluent-nhibernate

我有两个班级

public class Document 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<File> Files { get; set; } 
} 
public class File 
{ 
    public virtual int Id { get; protected set; } 
    public virtual Document Document { get; set; } 
} 

符合以下惯例:

public class HasManyConvention : IHasManyConvention 
{ 
    public bool Accept(IOneToManyPart target) 
    { 
        return true; 
    } 
    public void Apply(IOneToManyPart target) 
    { 
        target.Cascade.All(); 
    } 
} 

和这些映射覆盖

public class DocumentMappingOverride : IAutoMappingOverride<Document> 
{ 
    public void Override(AutoMap<Document> mapping) 
    { 
        mapping.HasMany(x => x.Files) 
            .Inverse() 
            // this line has no effect
            .Cascade.AllDeleteOrphan(); 
    } 
} 

public class FileMappingOverride : IAutoMappingOverride<File> 
{ 
    public void Override(AutoMap<File> mapping) 
    { 
        mapping.References(x => x.Document).Not.Nullable(); 
    } 
} 

我知道我需要为Document创建一个IClassConvention 改变级联行为,但我不能让这个工作! 如果我这样做:

public class DocumentConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
        return target.EntityType == typeof(Document); 
    } 
    public void Apply(IClassMap target) 
    { 
        target.SetAttribute("cascade", "all-delete-orphan"); 
    } 
} 

我得到:“未声明'cascade'属性。”

如果我这样做:

public class DocumentConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
        return target.EntityType == typeof(Document); 
    } 
    public void Apply(IClassMap target) 
    { 
        target.HasMany<Document, File>(x => x.Files) 
            .Inverse() 
            .Cascade.AllDeleteOrphan(); 
    } 
} 

然后我得到:

"Duplicate collection role mapping Document.Files"

所以我补充说:

mapping.IgnoreProperty(x => x.Files); 

到我的文档映射,但随后Files始终为空。 我究竟做错了什么? 如何覆盖单个HasMany关系的级联规则? 谢谢 安德鲁

P.S。对于this的交叉帖子感到抱歉,但我需要尽快解决这个问题。

1 个答案:

答案 0 :(得分:0)

我知道这是永远的(在计算机时间),你可能已经解决了这个问题。如果您没有或有其他类似问题的人看到这个,请点击这里:

我认为你需要创建一个实现IHasManyConvention的类。 IClassConvention修改了IClassMap<class>元素)目标。 cascade不是<class>的有效属性,因此会占第一个错误。在第二次尝试时,您正在重新映射该集合,从而导致“重复收集”错误。

IHasManyConvention定位IOneToManyPart,如果前者由于某种原因无效,您应该可以致电Cascade.AllDeleteOrphan()SetAttribute("cascade", "all-delete-orphan")

修改

抱歉,我错过了你已经有了IHasManyConvention。由于您只想覆盖一种类型的约定,因此您应该只更改该类型的约定上的Accept方法。而不是return true;,而不是DocumentConvention

return target.EntityType == typeof(Document);

我相信OneToManyPart.EntityType引用了包含的实体类型(即Document)。