0

このコードを実行すると、List メソッドによって Developer がフラッシュされます。私はこれが起こることを望んでいません。

Developer developer = null;
IEnumerable<Language> languages = null;
using (var session = this.SessionFactory.OpenSession())
using (var trx = session.BeginTransaction())
{
    developer = session.Get<Developer>(id);
    languages = session.CreateCriteria<Language>().List<Language>();
}

using言語が最初に取得されるように内部の行を入れ替えると、開発者はフラッシュされません。でも、よほどの理由がない限り、覚えておく必要はありません。

マッピングを変更する必要がありますか? 現在の外観は次のとおりです。

class DeveloperMap : ClassMap<Developer>
{
    public DeveloperMap()
    {
        Table("Developers");
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.FirstName);
        Map(x => x.LastName);
        References(x => x.FavoriteLanguage).Cascade.None();
        HasManyToMany(x => x.AssignedProjects)
            .Cascade.None()
            .Table("DevelopersProjects")
            .FetchType.Join();
    }
}

念のため、Developer クラスもあります。

public class Developer
{
    public virtual int? Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual Language FavoriteLanguage { get; set; }
    public virtual IList<Project> AssignedProjects { get; protected internal set; }
}
4

2 に答える 2

2

データを変更していない場合は、ゴースト (不必要な更新を強制する不適切なマッピング) がない限り、フラッシュはまったく行われません。何が正確にフラッシュされているかを (プロファイラーを使用して、SQL ログをチェックするなどして) 確認することをお勧めします。

自動フラッシュを防ぐには、 (デフォルト) またはsession.FlushMode以外に設定します。私の意見では、最も実用的な動作です。AutoAlwaysCommit

于 2013-01-16T11:11:09.913 に答える
1

読み取り専用操作を でラップTransactionすると、望ましくない結果が生じる傾向があることを何度か指摘してきました。Diego が言及しているように、これFlushは不適切なマッピングが原因である可能性があります。

hereに記載されているように、これにはパフォーマンス上の問題がある可能性があることを理解しています。ただし、読むだけの場合は、using(Transaction)ブロックは必要ありません。

それを削除してみてください。

using (var session = this.SessionFactory.OpenSession())
{
    developer = session.Get<Developer>(id);
    languages = session.CreateCriteria<Language>().List<Language>();
}
于 2013-01-16T15:51:08.957 に答える