2009-04-01 3 views
4

Ich habe zwei KlassenWie überschreiben ich eine Kaskade Regel der Konvention in fließend 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; } 
} 

mit folgender Konvention:

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

und diese Zuordnung überschreibt

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(); 
    } 
} 

Ich verstehe dass ich eine IClassConvention für Dokument zu machen muss, ändern Sie die ca Scade-Verhalten, aber ich kann das nicht zur Arbeit bringen! Wenn ich dies tun:

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"); 
    } 
} 

ich: „Das‚Kaskade‘Attribut nicht deklariert ist.“

Wenn ich dies tun:

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(); 
    } 
} 

Dann erhalte ich:

"Duplicate collection role mapping Document.Files" 

so hinzugefügt i:

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

zu meinem Dokument Mapping, aber dann auf Dateien ist immer leer. Was mache ich falsch? Wie kann ich die Kaskadenregel für eine einzelne HasMany-Beziehung überschreiben? Danke Andrew

P. s. Entschuldigung für das Cross-Post mit this, aber ich muss so schnell wie möglich gelöst werden.

Antwort

0

Ich weiß, das war für immer her (in der Computerzeit) und Sie könnten dies bereits gelöst haben. Wenn Sie nicht oder jemand anderes mit einer ähnlichen Frage sieht, geht hier:

Ich denke, Sie müssen eine Klasse erstellen, die IHasManyConvention implementiert. IClassConvention ändert ein IClassMap (das <class> Element) Ziel. cascade ist kein gültiges Attribut für <class>, so dass der erste Fehler berücksichtigt wird. Beim zweiten Versuch haben Sie die Auflistung neu zugeordnet, was zu dem Fehler "doppelte Sammlung" geführt hat.

IHasManyConvention Ziele eine IOneToManyPart, auf die Sie sollten anrufen Cascade.AllDeleteOrphan() oder nur SetAttribute("cascade", "all-delete-orphan") der Lage sein, wenn der ehemalige aus irgendeinem Grund nicht funktioniert hat.

EDIT

Leider verpasste ich, dass Sie bereits ein IHasManyConvention hatte. Da Sie Ihre Konvention für nur einen Typ überschreiben möchten, sollten Sie nur die Accept Methode auf Ihrer Konvention für diesen Typ ändern. Statt return true; zu ziehen, was Sie hatte auf dem DocumentConvention:

return target.EntityType == typeof(Document); 

Ich glaube, dass OneToManyPart.EntityType Referenzen der umschließende Entitätstyp (d Document).