2012-03-30 3 views
1

Ich habe eine Datenbank geerbt und versuche Fluent NHibernate zuzuordnen. Ich habe folgendes Schema:HasOne Oder Referenzen?

CREATE TABLE [Signatures](
    [Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL, 
    -- Other Fields.... 
) 

CREATE TABLE [SignoffSteps](
    [Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL, 
    [SignatureId] [int] NULL REFERENCES [Signatures]([Id]), 
    -- Other Fields.... 
) 

Und ich bin versucht, es zu folgenden (Zusätzlichen Eigenschaften und Zuordnungen weggelassen) zur Karte:

public class SignoffStep 
{ 
    public virtual int Id { get; set; } 
    public virtual Signature Signature { get; set;} 

    public class Map : ClassMap<SignoffStep> 
    { 
     public Map() 
     { 
      Table("SignoffSteps"); 
      Id(x => x.Id); 

      References(x => x.Signature, "SignatureId") 
       .Nullable() 
       .ForeignKey("FK_SingoffSteps_Signatures") 
       .Cascade.All() 
       .Not.LazyLoad(); 
     } 
    } 
} 

public class Signature 
{ 
    public virtual int Id { get; set; } 

    public class Map : ClassMap<Signature> 
    { 
     public Map() 
     { 
      Table("Signatures"); 
      Id(x => x.Id); 
     } 
    } 
} 

Dies funktioniert gut, mit Ausnahme eines Ärger: Signaturen löschen Ich kann es funktioniert, wenn ich manuell die Unterschrift:

session.Delete(signoffStep.Signature); 
signoffStep.Signature = null; 

Aber was ich möchte ist zu tun, setzen Sie einfach die Signature-Eigenschaft auf dem signoff Schritt auf null, und haben NHibernate automatisch das Kind löschen. Gibt es eine Möglichkeit, mein Mapping dafür einzurichten?

EDIT: Einstellung Cascade "All-löschen-Waise" nicht machbar: Intellisense

Antwort

0

Ich endete mit einer "ToDelete" -Eigenschaft auf der Signatur und löschte sie manuell, während ich speichere. Ich mag das nicht b/c es bricht die Abstraktion, aber es funktioniert für jetzt.

Ich denke, um es wirklich zu reparieren wollte ich, ich hätte die Tabellen und Assoziationen ein wenig wiederholen müssen. Leider war dies in diesem Fall nicht möglich.

1

Versuchen Sie, die Cascade Einstellung ändern, um "all-löschen-Waise". Momentan kaskadieren Sie alles außer DELETE, was bedeutet, dass die Datenbank sich beschweren wird, wenn Sie versuchen, einen "verwaisten" Datensatz zu erstellen. Indem Sie NHibernate mitteilen, wie Sie damit umgehen sollen (löschen Sie alle verwaisten Datensätze in der referenzierten Tabelle nach einem Aktualisierungs- oder Löschvorgang), vermeiden Sie das Problem.

Damit die NH-Kaskadierung funktioniert, muss der FK der referenzierenden Tabelle Nullwerte enthalten können, damit NH sie im ersten Durchgang auf null setzen kann (dh den Datensatz verwaisen). AFAIK, NH sieht derzeit keine Möglichkeit vor, die Löschung von Kinddatensätzen mit einem nicht nullbaren FK zu kaskadieren.

+0

Bearbeitung oben hinzugefügt. Cascade all-delete-orphan ist nicht möglich mit einer References-Beziehung, ich denke, das ist nur auf HasMany. –

+0

Upvotes für Aufwand. Vielen Dank! –