2012-03-27 15 views
16

Sto usando database In primo luogo, EF 4.1Il tipo di entità List`1 non fa parte del modello per il contesto attuale

sto ottenendo "Il tipo di entità List`1 non è parte del modello per il contesto attuale. " errore durante il tentativo di aggiornare un record dalla mia vista Modifica.

L'errore si verifica in

db.Entry(properties).State = EntityState.Modified; 

Ecco il mio modello:

public class Users 
    { 
    [Key] 
    public int User_ID { get; set; } 
    public string UserName { get; set; } 

    [NotMapped] 
    public IEnumerable<App_Properties> User_Properties 
    { 
      get { return Properties.Where(u => u.User_ID == User_ID); } 
    } 

    public virtual ICollection<App_Properties> Properties { get; set; } 
} 

public class App_Properties 
{ 
    [Key] 
    public int Prop_ID { get; set; } 
    public int User_ID { get; set; } 
    public int App_ID { get; set; } 
    public string Key { get; set; } 
    public string Value { get; set; } 
    public DateTime DateEntered { get; set; } 
    public DateTime DateModified { get; set; } 

    [ForeignKey("User_ID")] 
    public virtual Users Users { get; set; } 
} 

Ecco il mio controller:

[HttpPost] 
public ActionResult Edit(ICollection<App_Properties> properties) 
{ 
    if (ModelState.IsValid) 
    { 
      foreach (var item in properties) 
      { 
       db.Entry(properties).State = EntityState.Modified; 
      } 

      db.SaveChanges(); 

      return RedirectToAction("Index"); 
    } 

    return View(properties); 
} 

Ho il sospetto che il ciclo foreach non è appropriato in impostazione l'EntityState per ogni oggetto in un ICollection.

Qualsiasi assistenza sarebbe molto apprezzata.

+1

Una nota semantica rapida, i App_Properties.Users nome implicherebbe più utenti, non uno. La convenzione tende ad essere che un singolo oggetto ha un nome singolare che dice 'var users = new Users()' implica una raccolta di persone, non un singolo elemento. – Leniency

+0

Sì, grazie ... Non ho il controllo del DB e lascio che il nome improprio delle tabelle si propaghi nel mio codice. –

+0

I nomi db non devono per forza - è molto facile cambiare la mappatura del tuo POCO nella tabella del database attuale OnModelCreating: 'modelBuilder.Entity () .ToTable (" Users ")'. Una semplice ridenominazione di F2 nella classe Users propagherà quindi la rinomina nel progetto. Lo stesso vale per i nomi di proprietà: puoi personalizzarne una qualsiasi. http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx – Leniency

risposta

41

provare a cambiare il ciclo di:

foreach (var item in properties) 
{ 
    db.Entry(item).State = EntityState.Modified; 
} 

Stavi chiamando db.Entry(properties), quindi si stava tentando di collegare l'intera collezione in una sola volta. DbContext.Entry (oggetto) expects a single object, non una raccolta.

+1

Grazie .. Questo errore si è risolto ma aggiunto un "Oggetto con la stessa chiave già presente nell'errore objectstatemanager". Sono stato in grado di ottenere aiuto con questo errore da http://stackoverflow.com/questions/8254854/object-with-same-key-already-exists-in-objectstatemanager. –

+0

Grazie ... questo è stato utile –

8

Grazie, clemenza, per la risposta. Ha funzionato alla grande

Per quel che vale, io preferisco tenere i miei EntityState.Modified incarichi su una sola riga (come ho multipli) in modo da utilizzare il seguente LINQ:

properties.ForEach(p => db.Entry(p).State = EntityState.Modified); 
Problemi correlati