Le modèle de domaine domaines de l'audit de la DomainObject sont peuplées en utilisant un AuditInterceptor.Utilisation AuditInterceptor - références d'objet d'une instance transitoire - non enregistré enregistrer l'instance transitoire avant le rinçage
DomainObject Id EstablishDate EstablishId UpdateDate UpdateId Message : DomainObject Description MessageDistributions Distribution : DomainObject BeginEffective EndEffective MessageDistributions MessageDistribution : DomainObject Distribution Message
Dans ce ManyToMany relation la MessageDistribution met également en œuvre le DomainObject afin d'utiliser le AuditInterceptor. Cela m'empêche d'utiliser la clause HasManyToMany dans le mappage FluentNHibernate.
Voici le code de mappage.
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();
}
}
Ci-dessous est un test pour mettre en œuvre la relation ci-dessus.
[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);
}
J'exécuter le test en utilisant un coureur de test et il entraîne l'erreur suivante sur la ligne _repository.Save (message);
NHibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Speedway.StoreOperations.CrindMessaging.Core.Domain.Distribution
Dans mon AuditInterceptor J'ai un
Debug.WriteLine(string.Format("{0} : {1}", propertyNames[i], state[i]));
dans les événements "onSave et OnFlushDirty".
Je peux voir le Message et MessageDistribution arriver, mais l'entité Distribution n'est jamais touchée.
Ma question est la suivante: y a-t-il un problème avec mon FluentMapping? Est-ce que j'ai le "Inverse" au mauvais endroit? Quelqu'un at-il rencontré cette situation?