2009-04-01 8 views
4

règle en cascade d'une convention que j'ai deux classesComment remplacer dans Fluent NHibernate

public class Document 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<File> Files { get; set; } 
} 
public class File 
{ 
    public virtual int Id { get; protected set; } 
    public virtual Document Document { get; set; } 
} 

la convention suivante:

public class HasManyConvention : IHasManyConvention 
{ 
    public bool Accept(IOneToManyPart target) 
    { 
     return true; 
    } 
    public void Apply(IOneToManyPart target) 
    { 
     target.Cascade.All(); 
    } 
} 

et ceux-ci cartographie l'emporte sur

public class DocumentMappingOverride : IAutoMappingOverride<Document> 
{ 
    public void Override(AutoMap<Document> mapping) 
    { 
     mapping.HasMany(x => x.Files) 
      .Inverse() 
      // this line has no effect 
      .Cascade.AllDeleteOrphan(); 
    } 
} 

public class FileMappingOverride : IAutoMappingOverride<File> 
{ 
    public void Override(AutoMap<File> mapping) 
    { 
     mapping.References(x => x.Document).Not.Nullable(); 
    } 
} 

Je comprends que je dois faire un IClassConvention pour Document à changer le ca Scade comportement, mais je ne peux pas obtenir ce travail! Si je fais ceci:

public class DocumentConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
     return target.EntityType == typeof(Document); 
    } 
    public void Apply(IClassMap target) 
    { 
     target.SetAttribute("cascade", "all-delete-orphan"); 
    } 
} 

je reçois: "L'attribut 'cascade' est pas déclarée."

Si je fais ceci:

public class DocumentConvention : IClassConvention 
{ 
    public bool Accept(IClassMap target) 
    { 
     return target.EntityType == typeof(Document); 
    } 
    public void Apply(IClassMap target) 
    { 
     target.HasMany<Document, File>(x => x.Files) 
      .Inverse() 
      .Cascade.AllDeleteOrphan(); 
    } 
} 

Puis-je obtenir:

"Duplicate collection role mapping Document.Files" 

donc j'ajouté:

mapping.IgnoreProperty(x => x.Files); 

à mon mappage de documents, mais des fichiers est toujours vide. Qu'est-ce que je fais de mal? Comment puis-je remplacer la règle de cascade pour une seule relation HasMany? Merci Andrew

P.s. Désolé pour le poste croisé avec this mais j'ai besoin d'obtenir ce résolu dès que possible.

Répondre

0

Je sais que c'était pour toujours (en temps d'ordinateur) et vous pourriez avoir déjà résolu ceci. Dans le cas où vous n'avez pas ou quelqu'un d'autre avec une question similaire voit cela, voici:

Je pense que vous devez créer une classe qui implémente IHasManyConvention. IClassConvention modifie une cible IClassMap (élément <class>). cascade n'est pas un attribut valide pour <class>, ce qui explique la première erreur. Lors de votre deuxième tentative, vous avez mappé la collection, ce qui a entraîné l'erreur "duplicate collection".

IHasManyConvention cibles un IOneToManyPart, sur lequel vous devriez être en mesure d'appeler Cascade.AllDeleteOrphan() ou juste SetAttribute("cascade", "all-delete-orphan") si le premier ne fonctionne pas pour une raison quelconque.

EDIT

Désolé, j'ai raté que vous aviez déjà un IHasManyConvention. Puisque vous voulez remplacer votre convention pour un seul type, vous devriez juste changer la méthode Accept sur votre convention pour ce type. Au lieu de return true;, tirer ce que vous aviez sur votre DocumentConvention:

return target.EntityType == typeof(Document); 

Je crois que OneToManyPart.EntityType références le type d'entité contenant (à savoir Document).