Ok, die kurze Version ist, dass ich eine Linq-Entität von einem LinqDataSourceUpdateEventArgs habe und ich muss das Update manuell behandeln, weil MS dumm war.Gibt es eine generische Möglichkeit, eine Linq2SQL-Entität durch ihren Primärschlüssel zu erhalten?
kann ich die Tabelle Objekt aus dem Datenkontext erhalten, die mir erlaubt, na ja, dies:
var newObj = e.NewObject;
var table = FormContext.GetTable(e.NewObject.GetType());
table.Attach(newObj, e.OriginalObject);
if (BuildingObject != null)
BuildingObject(sender, new HeirarchicalBuildObjectEventArgs(newObj));
FormContext.SubmitChanges();
Leider bekomme ich die Ausnahme „Kann ein Unternehmen mit einem Schlüssel nicht hinzufügen, die bereits in Gebrauch ist . "
Natürlich ist der lustige Teil, ich bekomme das auf FormContext.SubmitChanges(), nicht auf table.Attach() ... was für mich keinen Sinn macht, aber was auch immer.
Ich denke, ich muss tatsächlich das Objekt aus dem Kontext zu bekommen, und anhängen, dass anstelle von e.OriginalObject ... ODER, als letztes Mittel, muss ich das ursprüngliche Objekt und schreiben eine Schleife, die kopiert den Wert jeder Eigenschaft in den, den ich aus dem Datenkontext bekomme.
So oder so, ich muss ein Objekt nach seinem Primärschlüssel suchen, ohne den Typ des Objekts zu kennen. Gibt es eine Möglichkeit, das zu tun?
EDIT: Ok, habe einen Blick durch .NET Reflector und ich merke, dass unter anderem LinqDataSourceView das OLD-Datenobjekt anhängt und kopiert dann alle Werte hinein ... aber das überspringt offenbar die Assoziationen. Ich werde versuchen, das alte Objekt anzuhängen und Werte zu kopieren, denke ich ...
Der wirklich lustige Teil? Ich schrieb eine Funktion Eigenschaften von einer Einheit Instanz zu einem anderen vor langer Zeit zu kopieren, und es enthält diesen Kommentar:
// Wir können Verbände nicht kopieren, und wahrscheinlich sollte nicht
Manchmal wünsche ich meine Kommentare waren gründlicher ...
EDIT BEARBEITEN: Ok, also noch einmal die richtige Antwort ist: Ich habe die falsche Frage gestellt!
Der richtige Code ist:
var newObj = e.NewObject;
var table = FormContext.GetTable(e.NewObject.GetType());
if (BuildingObject != null)
BuildingObject(sender, new HeirarchicalBuildObjectEventArgs(newObj));
table.Attach(newObj, e.OriginalObject);
FormContext.SubmitChanges();
e.Cancel = true;
ich ursprünglich nach BuildingObject zu befestigen versuchte, bekam aber einen anderen Fehler und zog die Aussage in dem Bemühen, bringen Sie ihn zu korrigieren. (Ich glaube, weil ich die falsche Version anhängen Aufruf wurde Vielleicht hatte ich die Argumente umgekehrt ....)
Wie können Sie eine Entität nachschlagen, wenn Sie ihren Typ nicht kennen? –
Ich kann den Tisch bekommen, ohne den Typ zu kennen. Irgendwo dort Linq2SQL weiß, dass etwas als Primärschlüssel markiert ist ... Ich sollte nicht wissen müssen, vor allem, weil ich eine flache Kopie des Objekts habe, das ich verwenden könnte, um es zu finden. In der Tat schaffen Dinge wie LinqDataSource das irgendwie ... sonst wären sie nicht in der Lage, das Verhalten, das ich neu schreiben will, auszuführen. – CodeRedick