Forums Neueste Beiträge
 

Update mit Linq2SQL

09/03/2008 - 17:18 von Andreas Gräfe | Report spam
Hallo,

ich habe mittels Linq2SQL eine kleine Anwendung aufgebaut, um Linq mal
zu testen. Nun habe ich aber auch schon die ersten Fragen.

Da ich einen Server (WCF) habe, in dem ich Linq verwende, übertrage ich
die Objekte zum Client. Dort werden die Daten geàndert und wieder an den
Server gesendet. Nun mache ich ein Update, wie Linq das anbietet. Habe
da auch schon viel gegoogelt. Mein Code ist folgender.

public void UpdateUser(User updateUser)
{
var original = db.Users.Single(u => u.Id == updateUser.Id);
db.Users.Attach(updateUser, original); // hier tritt der Fehler auf
db.SubmitChanges();
}

In der 2. Zeile tritt ein Fehler auf.

Fehlertext:

System.Data.Linq.DuplicateKeyException was unhandled by user code
Message="Cannot add an entity with a key that is already in use."
Source="System.Data.Linq"
StackTrace:
bei System.Data.Linq.Table`1.Attach(TEntity entity, TEntity
original)
bei MdbServiceLib.MovieService.UpdateUser(User updateUser) in
****MdbServiceLib\MovieService.cs:Zeile 237.
bei SyncInvokeUpdateUser(Object , Object[] , Object[] )
bei
System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance,
Object[] inputs, Object[]& outputs)
bei
System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&
rpc)

Was muss ich àndern? Die Beispiele, die ich gesehen habe, sind aber nach
dem gleichen Schema aufgebaut.

Andreas
 

Lesen sie die antworten

#1 Frank Dzaebel
09/03/2008 - 19:06 | Warnen spam
Hallo Andreas,

ich habe mittels Linq2SQL eine kleine Anwendung aufgebaut, um Linq mal zu
testen. Nun habe ich aber auch schon die ersten Fragen. [...]
public void UpdateUser(User updateUser)
{
var original = db.Users.Single(u => u.Id == updateUser.Id);
db.Users.Attach(updateUser, original); // hier tritt der Fehler auf
db.SubmitChanges();
}
In der 2. Zeile tritt ein Fehler auf [...]



Der Fehler wird ausgelöst, wenn dem Identitàtscache ein
Objekt mit einem Schlüssel hinzugefügt wird, der bereits
verwendet wird. Bei LinqToSQL normal dann, wenn
versucht wird, einen neuen Datensatz mit einem
*vorhandenen* Primàrschlüssel zu erstellen.

Das kann auch schon durchaus durch das reine
Debuggen eines LinqToSQL-Projekts auftreten!
Wenn Beziehungen einer Entitàt durchlaufen werden,
werden diese Elemente in den Cache eingefügt und
von LinqToSQL erkannt. Wenn Du dann ein Attach
oder InsertOnSubmit o.à. aufrufst, durch die ggf.
Zeilen mit demselben Schlüssel generiert werden,
wird eine DuplicateKeyException ausgelöst.

Andere Links/Möglichkeiten dazu evtl. hilfreich:

[LINQ to SQL and Disconnected Entities Follow-up - Rick Strahl's Web Log]
http://west-wind.com/weblog/posts/135659.aspx

[DuplicateKeyException: "Cannot add an entity with a key that is already in
use." - MSDN Forums]
http://forums.microsoft.com/MSDN/Sh...p;SiteID=1

[DataContext cannot manage Stored Proc for Insert - MSDN Forums]
http://forums.microsoft.com/MSDN/Sh...spx?PostID75634&SiteID=1

dies mal so kurz, als erste Nàherung ...


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen