Codice EF prima - non è in grado di aggiornare una riga di database
-
28-09-2019 - |
Domanda
cercava qualche codice con il EF "primo codice" Metodo e corse in uno strano problema.
Il mio DataContext:
public class BookmarkerDataContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasKey(u => u.UserId);
base.OnModelCreating(modelBuilder);
}
}
Se l'oggetto utente è:
public class User
{
public long UserId { get; set; }
public ICollection<Tag> Tags { get; set; }
}
Nel mio codice che sto facendo qualcosa di abbastanza semplice:
public void UpdateUserTags(User user,ICollection<Tag> taglist)
{
user.Tags = new List<Tag>(user.Tags.Union(taglist));
datacontext.Users.Add(user);
datacontext.SaveChanges();
}
L'oggetto utente sto passando a questa funzione è il risultato di qualcosa di simile:
datacontext.Users.SingleOrDefault(u => u.UserId==id)
Ogni volta che io chiamo i UpdateUserTags funzione sembra creare una nuova riga nella tabella utente, invece di aggiornarlo. Sto facendo qualcosa di sbagliato qui?
Soluzione
@Donald è corretta, è necessario Attach
al ObjectContext quando si effettuano gli aggiornamenti.
Tuttavia, questo è solo se il soggetto si stacca.
Se suona come voi hanno già recuperato il singola entità dal grafico:
var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);
Il che significa che non è necessario collegare o scarica di nuovo. Basta fare questo:
var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);
user.Tags = new List<Tag>(user.Tags.Union(taglist));
context.SaveChanges();
Tuttavia, non voglio raccomandare sostituendo l'intero Tag di raccolta, aggiungere i tag:
user.Tags.Add(someTag);
HTH
Altri suggerimenti
Credo che si desidera Attaccare il tuo oggetto al contesto dati , invece di aggiungere esso.
public void UpdateUserTags(User user,ICollection<Tag> taglist)
{
datacontext.Attach(user);
user.Tags = new List<Tag>(user.Tags.Union(taglist));
datacontext.SaveChanges();
}
Una volta che è collegato, allora il contesto diventa consapevole dell'oggetto. Una volta salvato le modifiche, che deve essere mantenuta al database.
Non questa riga
datacontext.Users.Add (utente);
segnare sempre il record dell'utente come bisogno di essere aggiunto alla tabella utenti.
Credo che bisogna di staccare l'utente dal vecchio contesto e allegarlo alla nuova per essere correttamente in grado di aggiornare il record. ma io non sono EF Wonk così YMMV
Questo non ha nulla a che fare con il problema particolare, ma per caricamento pigro si sta andando a voler Tag da marcare virtuale
public virtual ICollection<Tag> Tags { get; set; }
Inoltre, sembra che si sta cercando di aggiungere nuove etichette per un utente (o aggiornare i loro tag) se questo è il caso, allora si sta andando a voler utilizzare Fissare come suggerito Donald