2

ずっと前にFluentNHグループに投稿しましたが、今日まで回答がありませんでした。だから、ここに問題があります:私は1対多の関係を定義していて、片側には逆フラグが設定されています。マッピングコードは次のようになります。

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の動作がバグであることを誰かが確認できるかどうか疑問に思いました。

ありがとう。

4

4 に答える 4

3

この方法で試しましたか?:

var receita = BuildMeAReceita();
var imagems = BuildSomeImagems();
foreach(var imagem in imagems){
    receita.AdicionaImagem(imagem);
}
new PersistenceSpecification<Receita>(sess)
.VerifyTheMappings(receita);
于 2011-09-30T21:30:06.930 に答える
0

試す:

    References(img => img.Receita)
        .Column("IdReceita")
        .Not.Nullable();

私の推測では、実際のコードは最初にRecietaを保存して、挿入が正しい順序で発行されるようにします。最初にImagemを保存するようにそのコードを変更した場合、NHibernateがImagemを挿入してから外部キーで更新しようとするため、同じエラーが発生します。

于 2011-09-24T13:35:14.037 に答える
0

のマッピングを変更できますImagem

References(img => img.Receita)
            .Column("IdReceita")
            .Cascade.SaveUpdate();

Receitaこれは前に持続しますImagem

私が見つけたのは、それはPersistanceSpecificationかなり単純な関係にうまく機能するということですが、複雑なオブジェクトグラフがある場合は、すべてのオブジェクトをカスケード接続する必要があります。ただし、シナリオはかなり単純なので、この小さな変更により、を使用してこれをテストできるはずですPersistanceSpecification

編集:

また、AdicionaImagem関数で画像の親を設定していることを確認してください。次に例を示します。

public virtual void AdicionaImagem(Imagem newImagem)
{
    newImagem.Receita = this;
    imagems.Add(newImagem);
}
于 2011-09-30T01:21:09.187 に答える
0

コードには2つの問題が考えられます。

  1. Imagem.Bytesプロパティは遅延読み込みされますが、Imagemistselfの遅延読み込み は無効になっています。これは、 Imagem インスタンスのプロキシが生成されず、バイトを遅延ロードできないことを意味します。ミッションインポッシブルです(少なくとも、現時点ではわかりません)。データベース(session.Get<Imagem>(id);)からの単純なロードにより、次のような例外が発生します Invalid Cast (check your mapping for property type mismatches); setter of Imagem。解決策は、Imagemで遅延読み込みを有効にするか、Bytesプロパティで遅延読み込みを無効にすることです。
  2. PersistenceSpecificationは、テストされたエンティティをデータベースから別のインスタンスとしてロードします。これは、デフォルトの等式比較器がうまく機能しないことを意味します。この問題を解決するには、独自の等式比較子を提供する必要があります(詳細についてはこれを確認してください)。

これがReceitaエンティティとImagemエンティティ、IEqualityComparerPersistentSpecificationスニペットの実装です。このコードは、NH3.1およびFNH1.2で適切に機能します。コードがこれらのスニペットと何らかの形で異なる場合はお知らせください。

于 2011-10-04T21:18:45.370 に答える