2010-07-12 5 views
1

비즈니스 응용 프로그램에서 SQL Server 2008 Express 데이터베이스를 유지하려면 Fluent로 Nhibernate를 사용하고 있습니다.SQL Server 트리거를 사용하는 동안 Nhibernate 캐시 문제가 발생했습니다.

나는 ReceiptItems라는 이름의 많은 개체가있는 목록을 포함하는 Receipt라는 클래스가 있습니다. 사용자는 영수증을 생성하고 ReceiptItems를 여기에 추가하고 Finished로 표시되지 않은 한 편집 할 수 있습니다. 이 부분은 잘 작동하고 db에 올바르게 저장됩니다. 이제 문제 :

또한 SQL 테이블 Receipt에 트리거가 있습니다. inserted.Finished가 true이면 트리거됩니다. 트리거는 "공급 업체 테이블"에서 새 가격을 가져오고 ReceiptItems 테이블의 모든 ReceiptItems에 대한 가격을 업데이트합니다 ( ).

호출 session.SaveorUpdate (값) 다음 transaction.Commit()

후자는 예외가 발생합니다 StaleObjectStateException 행이 갱신 또는 삭제 다른 트랜잭션 (또는 저장되지 않은 값의 매핑이였습니다을 잘못된) ReceiptItems

방아쇠를 제거하면 문제가 해결되지만 가격을 업데이트해야합니다. nhibernate가 오류를 무시하고 트리거가 실행 된 후 캐시를 새로 고치는 방법이 있습니까? 유창함 매핑으로

간단한 클래스 예제 정의 :

public class Receipt 
    { 

     public Receipt() { } 
     /// <summary>Identificator/// </summary> 
     public virtual int Id { get; private set; } 
     /// <summary> if finished true, cant edit data/// </summary> 
     public virtual Boolean Finished { get; set; } 
     /// <summary>Items of this Receipt/// </summary> 
     public virtual IList<ReceiptItems> Items{ get; set; } 
    } 

    /// <summary>Mapping for NHibernate Fluent/// </summary> 
    public class ProdajaMap : ClassMap<Prodaja> 
    { 

     public ReceiptMap() 
     { 
      Table("Receipt"); 
      OptimisticLock.All(); 
      DynamicUpdate(); 
      Id(x => x.Id); 
      Map(x => x.Finished); 
      HasMany<ReceiptItems>(x => x.Items).AsBag().KeyColumn("Receipt_ID"); 
     } 
    } 

public class ReceiptItem 
    { 

     public ReceiptItem() { } 

     public virtual int Id { get; private set; } 
     /// <summary>Id of the Receipt/// </summary> 
     public virtual int Receipt_ID{ get; set; } 

     /// <summary>Supplier price/// </summary> 
     public virtual decimal Price{ get; set; } 
     /// <summary>Supplier discount/// </summary> 
     public virtual decimal Discount { get; set; } 
    } 

    /// <summary>Mapping for NHibernate Fluent/// </summary> 
    public class ReceiptItemMap : ClassMap<ReceiptItem> 
    { 
     public ReceiptItemMap() 
     { 
      Table("ReceiptItems"); 
      OptimisticLock.All(); 
      DynamicUpdate(); 
      Id(x => x.Id); 
      Map(x => x.Receipt_ID).Column("Receipt_ID"); 
      Map(x => x.Price); 
      Map(x => x.Discount); 

     } 
    } 

대단히 감사합니다!

업데이트 : 내가 가격으로, 필요 할인 값은 트리거에 의해 생성 될 필요가 정확히 수행하는하는 NHibernate에 속성을 발견했습니다

:

5.6. 생성 된 속성 생성 된 속성은 데이터베이스에 의해 생성 된 값이 인 속성입니다. 일반적으로 Hibernate 응용 프로그램은 데이터베이스가 값을 생성하는 모든 특성을 포함하는 객체 을 새로 고쳐야합니다. 생성 된대로 표시 속성을 표시하지만 은 응용 프로그램이 에 대한 책임을 최대 절전 모드로 위임 할 수 있도록합니다. Hibernate는 생성 된 속성을 정의한 엔티티 에 대해 SQL INSERT 또는 UPDATE를 발행 할 때마다 즉시 select를 발행하여 생성 값을 검색합니다.

생성 된 것으로 표시된 속성은 추가적으로 삽입 할 수 없으며 은 업데이트 할 수 있어야합니다.

이 새로운 기능은 .. 마지막 문장이 의미하는 바는 삽입하거나 값을 nhibernate로 업데이트 할 수 없다는 것입니다.

답변

1

트리거에 SET NOCOUNT ON을 사용하면 (xx rows affected) "더미"결과 집합이 트리거 처리에서 제외됩니다.

예 SO 질문 : TooManyRowsAffectedException with encrypted triggers

+0

는 이미 모든 트리거에서 SET NOCOUNT ON을 사용했는데 그것은 트릭을하지 않았다. 그러나 어쨌든 고마워! – wabbawabbe

관련 문제