2012-03-27 24 views
16

He estado usando la base de datos En primer lugar, EF 4.1El tipo de entidad List`1 no es parte del modelo para el contexto actual

que estoy recibiendo "El tipo de entidad List`1 no es parte del modelo de el contexto actual ". error al tratar de actualizar un registro desde mi vista de edición.

El error se produce en

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

Aquí es mi modelo:

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; } 
} 

Aquí está mi controlador:

[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); 
} 

Sospecho que el bucle foreach no es apropiado en el establecimiento EntityState para cada elemento en una colección.

Cualquier ayuda sería muy apreciada.

+1

Una nota rápida semántica, los App_Properties.Users nombre indica usuarios múltiples, no uno La convención tiende a ser que un solo objeto tiene un nombre singular que dice 'var users = new Users()' implica una colección de personas, no un solo elemento. – Leniency

+0

Sí, gracias ... No tengo control de la base de datos y dejo que la nomenclatura incorrecta de las tablas se propague a mi código. –

+0

No obstante, los nombres db no tienen por qué serlo: es muy fácil cambiar la asignación de su POCO a la tabla de base de datos real OnModelCreating: 'modelBuilder.Entity () .ToTable (" Users ")'. Una simple redenominación F2 en la clase Users propagará el rename en su proyecto. Lo mismo con los nombres de las propiedades: puede asignar un mapa personalizado. http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx – Leniency

Respuesta

41

trate de cambiar su bucle para:

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

estuviera llamando a db.Entry(properties), por lo que estaba tratando de unir toda la colección a la vez. DbContext.Entry (object) expects a single object, no es una colección.

+1

Gracias ... Eso eliminó ese error, pero agregó un "Objeto con la misma clave ya existe en el error objectstatemanager". Pude obtener ayuda con ese error de http://stackoverflow.com/questions/8254854/object-with-same-key-already-exists-in-objectstatemanager. –

+0

Gracias ... esto fue útil –

8

Gracias, Leniency, por la respuesta. Funcionó muy bien.

Por lo que vale la pena, prefiero mantener mis EntityState.Modified tareas en una sola línea (como tengo múltiplos) de modo utilizó la siguiente LINQ:

properties.ForEach(p => db.Entry(p).State = EntityState.Modified); 
Cuestiones relacionadas