2009-11-03 3 views
1

DomainObject의 감사 필드AuditInterceptor를 사용하여 채워되는 도메인 모델을 세척하기 전에 transient 인스턴스를 저장합니다. 이 ManyToMany 관계에서 사용 AuditInterceptor - 객체 참조 저장되지 않은 과도 인스턴스 -

DomainObject 
    Id 
    EstablishDate 
    EstablishId 
    UpdateDate 
    UpdateId 

Message : DomainObject 
    Description 
    MessageDistributions 

Distribution : DomainObject 
    BeginEffective 
    EndEffective 
    MessageDistributions 

MessageDistribution : DomainObject 
    Distribution 
    Message 

MessageDistribution 또한 AuditInterceptor를 사용하기 위해 DomainObject을 구현한다. 이것은 FluentNHibernate 매핑에서 HasManyToMany 절을 사용하지 못하게합니다.

다음은 매핑 코드입니다.

public class MessageMap : ClassMap<Message> 
{ 
    public MessageMap() 
    { 
     WithTable("Message"); 

     Id(x => x.Id).GeneratedBy.Identity().ColumnName("MessageSeq").WithUnsavedValue(0); 
     Map(x => x.Description).ColumnName("SummaryName"); 
     Map(x => x.EstablishDate); 
     Map(x => x.EstablishId); 
     Map(x => x.UpdateDate); 
     Map(x => x.UpdateId); 


     HasMany(x => x.MessageDistributions) 
      .KeyColumnNames.Add("MessageSeq") 
      .Access.AsCamelCaseField(Prefix.Underscore) 
      .Cascade.All().Inverse(); 

    } 
} 

public class MessageDistributionMap : ClassMap<MessageDistribution> 
{ 
    public MessageDistributionMap() 
    { 
     WithTable("MessageDistribution"); 

     Id(x => x.Id).GeneratedBy.Identity().ColumnName("MessageDistributionSeq").WithUnsavedValue(0); 

     Map(x => x.EstablishDate); 
     Map(x => x.EstablishId); 
     Map(x => x.UpdateDate); 
     Map(x => x.UpdateId); 

     References(x => x.Message).ColumnName("MessageSeq"); 
     References(x => x.Distribution).ColumnName("DistributionSeq"); 
    } 
} 

public class DistributionMap : ClassMap<Distribution> 
{ 
    public DistributionMap() 
    { 
     WithTable("Distribution"); 

     Id(x => x.Id).GeneratedBy.Identity().ColumnName("DistributionSeq").WithUnsavedValue(0); 

     Map(x => x.BeginEffectiveDate); 
     Map(x => x.EndEffectiveDate); 
     Map(x => x.EstablishDate); 
     Map(x => x.EstablishId); 
     Map(x => x.UpdateDate); 
     Map(x => x.UpdateId); 

     HasMany(x => x.MessageDistributions) 
      .KeyColumnNames.Add("DistributionSeq") 
      .Access 
      .AsCamelCaseField(Prefix.Underscore) 
      .Cascade.All().Inverse(); 
    } 
} 

다음은 위의 관계를 구현하는 테스트입니다.

[Test] 
public void Should_Add_A_Message_To_Existing_Distribution() 
{ 
    var desc = "Test message " + DateTime.Now; 
    var message = new Message { Description = desc, PumpType = 1 }; 

    var distribution = new Distribution 
          { 
           BeginEffectiveDate = new DateTime(2009, 9, 2), 
           EndEffectiveDate = new DateTime(2009, 9, 10), 
           Priority = 1 
          }; 
    var messageDistribution = new MessageDistribution { Distribution = distribution }; 

    message.AddMessageDistribution(messageDistribution); 

    _repository.Save(message); 
    _repository.Clear(); 

    var retrievedMessage = _repository.GetById(message.Id); 

    Assert.AreEqual(message, retrievedMessage); 

    Assert.AreEqual(distribution, retrievedMessage.MessageDistributions[0].Distribution); 
} 

테스트 러너를 사용하여 테스트를 실행하면 _repository.Save (메시지) 줄에 다음 오류가 발생합니다. 내 AuditInterceptor에서

NHibernate.TransientObjectException: 
    object references an unsaved transient instance - 
save the transient instance before flushing: 
    Speedway.StoreOperations.CrindMessaging.Core.Domain.Distribution 

는 내가 "된 OnSave 및 OnFlushDirty"이벤트에

Debug.WriteLine(string.Format("{0} : {1}", propertyNames[i], state[i])); 

있습니다.

Message와 MessageDistribution은 통과하지만 Distribution 엔티티는 절대 건드리지 않습니다.

제 질문은, FluentMapping에 문제가 있습니까? 나는 잘못된 장소에 "Inverse"가 있습니까? 이 상황에 처한 사람이 있습니까?

답변

0

FluentMapping이 정상적으로 보입니다. 이와

var messageDistribution = new MessageDistribution { Distribution = distribution }; 

:

var messageDistribution = new MessageDistribution { Distribution = distribution, Message = message }; 

을 다시 시도 테스트에 다음 줄을 변경하려고합니다.

관련 문제