很久以前我已经在 Fluent NH 群里发过这个了,但直到今天才得到任何答复。所以,问题来了:我定义了一个一对多的关系,并且一侧设置了反向标志。映射代码如下所示:
public class MapeamentoReceita : ClassMap<Receita> {
public MapeamentoReceita() {
Table("Receitas");
Not.LazyLoad();
Id(rec => rec.Id, "IdReceita")
.GeneratedBy
.HiLo("TabelaHilo", "ProximoHi", "1000", "Tabela='receitas'")
.Default(0);
Version(rec => rec.Versao);
//other props go here
HasMany(rec => rec.Imagens)
.Access.CamelCaseField((Prefix.Underscore))
.AsBag()
.Cascade.All()
.KeyColumn("IdReceita")
.Not.LazyLoad()
.Inverse();
}
}
现在,Imagem 的映射如下所示:
public class MapeamentoImagem : ClassMap<Imagem> {
public MapeamentoImagem() {
Table("Imagens");
Not.LazyLoad();
Id(img => img.Id, "IdImagem")
.GeneratedBy
.HiLo("TabelaHiLo", "ProximoHi", "1000", "Tabela='imagens'")
.Default(0);
Map(img => img.Bytes)
.CustomSqlType("image")
.CustomType<Byte[]>()
.LazyLoad()
.Length(2000000000)
.Not.Nullable()
.Not.Update();
References(img => img.Receita)
.Column("IdReceita")
.Cascade.None();
}
}
这是测试这些类的持久性的代码:
new PersistenceSpecification<Receita>(sess)
.CheckList(rec => rec.Imagens,
_imagens,
(receita, imagem) => receita.AdicionaImagem(imagem))
.VerifyTheMappings();
即使 Inverse 处于“打开”状态,PersistenceSpecification 也会尝试在插入 Receita 之前插入 Imagem。由于 IdReceita 是配置为不接受 null 的外键,因此我最终遇到了异常。我已经尝试编写使用 receita 的“真实世界代码”并且它可以工作(我已经打开了 SQL,我可以看到在这种情况下,Receita 应该插入到 Imagem 之前)。
由于没有人在 FH 组上回答这个问题,我想知道是否有人可以确认这个 PersistenceSpecification 行为是一个错误。
谢谢。