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"가 있습니까? 이 상황에 처한 사람이 있습니까?