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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top