2009-06-02 10 views
0

FluentNHibernateでSaveOrUpdateメソッドを使用してエンティティを更新すると、何も起こりません。 Flushは機能しますが、既存のリポジトリインフラストラクチャのためにSaveOrUpdateを使用したいと思います。何が問題なの?FluentNHibernateを使用してSaveOrUpdateで何も起こらない

構成:

sessionFactory = Fluently.Configure() 
    .Database(MsSqlConfiguration 
     .MsSql2005 
      .ConnectionString(c => c.FromConnectionStringWithKey("repository"))) 
     .Mappings(m => m.FluentMappings 
      .AddFromAssemblyOf<InvoiceMap>()) 
    .BuildSessionFactory(); 

マッピング:

public InvoiceMap() 
{ 
    Id(x => x.InvoiceID, "InvoiceID"); 
    Map(x => x.InvoiceNumber); 
    Map(x => x.InvoiceDate); 
    Map(x => x.Company).CustomTypeIs<CompanyType>(); 
    Map(x => x.TransactionNumber).CustomTypeIs<TransactionNumberType>(); 
    Map(x => x.LongAddressBookNumber); 
    Map(x => x.PurchaseOrderNumber); 
    Map(x => x.ReceivedDateTime); 
    Map(x => x.OCR); 
    Map(x => x.DocumentNumber); 
    Map(x => x.DocumentType); 
    Map(x => x.PaymentStatus).CustomTypeIs<PaymentStatusType>(); 
    HasMany(x => x.Attestations) 
     .KeyColumnNames.Add("InvoiceID") 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .AsBag(); 
    HasMany(x => x.AttestationRequests) 
     .KeyColumnNames.Add("InvoiceID") 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .AsBag(); 
    HasMany(x => x.States) 
     .KeyColumnNames.Add("InvoiceID") 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .AsBag(); 
} 

public AttestationMap() 
{ 
    Id(x => x.ID, "AttestationID"); 
    Map(x => x.ReceivedAt); 
    Map(x => x.IsInvalid, "Invalid"); 
    Map(x => x.InvalidationReason); 
    Map(x => x.FileName); 
    Map(x => x.FileData); 
    References<EmployeeSnapshot>(x => x.Certifier, "Certifier") 
     .Cascade.All() 
     .FetchType.Join(); 
    References<Invoice>(x => x.Owner, "InvoiceID"); 
} 

public AttestationReminderMap() 
{ 
    Id(x => x.ID, "AttestationReminderID"); 
    Map(x => x.CC) 
     .CustomTypeIs<RecipientType>(); 
    Map(x => x.Message); 
    Map(x => x.SentAt); 
    References<AttestationRequest>(x => x.Owner, "RequestID"); 
} 

任意のアイデア?あなたは何も起こらないと言うとき

おかげで、 クリストファー

+0

Nhibernateはできるだけ遅くにフラッシュしようとします..あなたのセッションはトランザクションに結びついていますか? – Surya

+0

はい、ISession.BeginTransaction()によって、FlushModeの設定問題をデフォルト値に解決しました。 – Kristoffer

答えて

2

は、あなたは何もフラッシュなしでDBに起こらないことを意味するのですか?

もしそうなら、それは予想される動作です。 FlushはNHibにメモリ内の変更をDBに書き出すように指示します。

+0

申し訳ありませんが、はい、それは私の言いたいことです。しかし、SaveOrUpdateメソッドの目的は何ですか?私はベストプラクティスのガイドラインを読んでいました。これはSaveOrUpdateがレイヤードアプリケーションで使用されるべきであることを示唆しています。 ありがとう – Kristoffer

+1

SaveOrUpdateは、現在のセッションを禁止するためにオブジェクトに加えた変更をコミットします。あなたがそれをフラッシュするまで、セッションは書かれていません。 SaveOrUpdateとSaveまたはUpdateは、それがオブジェクトの新しいインスタンスであるかどうかを自動的に判断し、適切に保管します。 –

0

何とか私はセッションのFlushModeをNeverに設定することができました。 Chadが私に説明したように、Flushへの明示的な呼び出しの必要性が生じました。 FlushModeをデフォルト値のままにしてTransactionを使用すると、エンティティは期待通りに更新されます。

関連する問題