2009-11-03 6 views
1

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?

Répondre

0

Votre FluentMapping semble OK. Essayez de changer la ligne suivante dans votre test:

var messageDistribution = new MessageDistribution { Distribution = distribution }; 

avec ceci:

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

et essayez à nouveau.

Questions connexes