4 Stimmen

DeleteOnNull (Assoziationsattribut) für Linq to SQL in einer benutzerdefinierten Klasse?

Ist es möglich, die Option "DeleteOnNull=true" zu einer benutzerdefinierten Klasse hinzuzufügen, anstatt die (generierte) DBML-Klasse direkt zu ändern?

Nehmen wir zum Beispiel an, dass dies ein Teil meiner generierten dbml-Klasse ist:

[Table(Name="OrderDetails")]
public partial class OrderDetail : 
       INotifyPropertyChanging, INotifyPropertyChanged
{
    // deleted for brevity

    [Association(Name="Order_OrderDetail", 
         Storage="_Order", ThisKey="OrderId", 
         OtherKey="OrderId", IsForeignKey=true, DeleteOnNull=true)]
    public Order Order 
    {
        get { /* deleted */ }
        set { /* deleted */ }
    }
}

Also ist es möglich, die "DeleteOnNull=true" auf eine separate Klasse zu setzen? Ist das möglich? Und wie? Ich habe das Folgende ohne Erfolg ausprobiert:

[MetadataType(typeof(OrderDetailMetadata))]
public partial class OrderDetail {
    internal sealed class OrderDetailMetadata
    {
        [Association(DeleteOnNull = true)]
        public object Order;
    }
}

1voto

Matt Kocaj Punkte 10936

Vielleicht brauchen Sie den MetaData-Typ nicht. Wird dies in Ihrem zusätzlichen Teil funktionieren:

public partial class OrderDetail {
    [Association(DeleteOnNull = true)]
    public Order Order;
}

das weiß ich von selbst Order ist nicht definiert, aber man sollte nicht so bauen müssen. Dieses MSDN-Dokument legt nahe, dass dies möglich sein sollte (wenn ich es richtig lese).

1voto

Funka Punkte 4250

Besser spät als nie:

Wenn Sie den Designer zum Erstellen Ihrer LTS-Konfiguration und Entitäten verwendet haben, können Sie mit der rechten Maustaste auf die DBML-Datei klicken und "Öffnen mit..." wählen. Wählen Sie nun XML Editor und klicken Sie auf OK.

Finden Sie Ihr Order_OrderDetail Assoziation in dieser Datei, dann fügen Sie DeleteOnNull="true" dazu. Speichern Sie die Datei und lassen Sie LTS Ihre Klassen für Sie neu generieren. Geschafft! Ihre Änderungen an der generierten Codedatei werden nicht mehr überschrieben!

0voto

Matt Kocaj Punkte 10936

Ich würde die Baugruppe bauen und dann Reflektor um die Klasse zu prüfen, ob sie die Attributeigenschaften der partiellen Klasse besitzt. Wenn auch das nicht funktioniert, müssen Sie vielleicht etwas anderes versuchen. Diese Art der Attributüberschneidung wird möglicherweise nicht unterstützt.

Was wollen Sie damit erreichen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X