我有两节课
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; }
}
Run Code Online (Sandbox Code Playgroud)
具有以下约定:
public class HasManyConvention : IHasManyConvention
{
public bool Accept(IOneToManyPart target)
{
return true;
}
public void Apply(IOneToManyPart target)
{
target.Cascade.All();
}
}
Run Code Online (Sandbox Code Playgroud)
和这些映射覆盖
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要为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");
}
}
Run Code Online (Sandbox Code Playgroud)
我得到:"'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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我得到:
"Duplicate collection role mapping Document.Files"
Run Code Online (Sandbox Code Playgroud)
所以我补充说:
mapping.IgnoreProperty(x => x.Files);
Run Code Online (Sandbox Code Playgroud)
到我的文档映射,但然后文件始终为空.我究竟做错了什么?如何覆盖单个HasMany关系的级联规则?谢谢Andrew
PS对不起,用交叉后这个,但我需要得到这个尽快解决.
我知道这已经是很久以前的事了(在计算机时代),你可能已经解决了这个问题。如果您还没有或其他有类似问题的人看到此内容,请参阅以下内容:
我认为你需要创建一个实现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);
Run Code Online (Sandbox Code Playgroud)
我相信OneToManyPart.EntityType引用包含实体类型(即Document)。
| 归档时间: |
|
| 查看次数: |
2053 次 |
| 最近记录: |