0

J'utilise Fluent NHibernate dans une tentative d'améliorer la testabilité et la maintenabilité sur une application web qui utilise une base de données existante et je vais avoir quelques problèmes cartographier cette structure correctement:Courant NHibernate Inscrit Références Ignorer Règle Cascade

J'ai deux tables qui représentent vraiment une entité dans le domaine, et donc j'utilise une jointure pour les mapper en tant que tel, et une troisième table qui représente une deuxième entité.

Tables DB:

[eACCT] 
    ACCT_ID 
    ACCT_NAME 

[eREPORT_TYPE] 
    ACCT_ID 
    REPORT_NO 

[eREPORT_TYPE_DESC] 
    REPORT_NO 
    REPORT_TYPE 

Entités:

public class Account 
{ 
    public virtual string AccountID { get; set; } 
    public virtual string AccountName { get; set; } 
    public virtual ReportType ReportType { get; set; } 
} 

public class ReportType 
{ 
    public virtual int Number { get; set; } 
    public virtual string Type { get; set; } 
} 

Cartographie:

public AccountMap() 
    { 
     Table("eACCT"); 
     Id(x => x.AccountID, "ACCT_ID"); 
     Map(x => x.AccountName, "ACCT_NAME"); 

     Join("eREPORT_TYPE", m => 
     { 
      m.KeyColumn("ACCT_ID"); 
      m.References(x => x.ReportType) 
       .Cascade.None() 
       .Column("REPORT_NO"); 
     }); 
    } 

    public ReportTypeMap() 
    { 
     Table("eREPORT_TYPE_DESC"); 
     Id(x => x.Number) 
      .Column("REPORT_NO") 
      .GeneratedBy.Assigned(); 
     Map(x => x.Type, "REPORT_TYPE"); 
    } 

Cela fonctionne bien pour mon GETS, b Lorsque je modifie Account.ReportType.Number puis SaveOrUpdate() Account, j'obtiens l'erreur: 'l'identifiant d'une instance de DataTest.Model.ReportType a été modifié de (old_value) à (new_value)'. Tout ce que je veux faire est de modifier la référence du compte à ReportType et je pensais qu'en définissant la propriété Cascade.None() sur la référence à ReportType, NHibernate ne tenterait pas d'enregistrer l'instance ReportType, mais je dois être mal compris comment cela fonctionne. J'ai essayé de faire ReportType ReadOnly(), en faisant la référence à ReportType ReadOnly(), etc et rien ne semble aider.

Des idées?

Répondre

0

Enfin résolu ce problème. Il s'avère que je ne pensais pas à cela d'une manière NHibernate. Dans mon esprit, j'avais un nouveau ReportType.Number, donc c'est ce que j'avais besoin de mettre à jour. En réalité, ce que je devais faire était obtenir le ReportType avec le nouveau ReportType.Number et définir le Account.ReportType. Le faire de cette façon a fonctionné comme prévu.