我有两个班级
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的交叉帖子感到抱歉,但我需要尽快解决这个问题。
答案 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
)。