2012-03-27 2 views
16

Я использую базы данных Во-первых, EF 4,1Тип объекта List`1 не является частью модели для текущего контекста

Я получаю «тип сущности List`1 не является частью модели текущий контекст ". при попытке обновить запись из моего Edit View.

Ошибка происходит при

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

Вот моя модель:

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

Вот мой контроллер:

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

Я подозреваю, что цикл Еогеасп не подходит в настройке EntityState для каждого элемента в ICollection.

Любая помощь будет принята с благодарностью.

+1

Быстрый семантическое примечание, то имя App_Properties.Users будет означать несколько пользователей, а не один. Как правило, конвенция состоит в том, что один объект имеет уникальное имя, так как «var users = new Users()» подразумевает коллекцию людей, а не один элемент. – Leniency

+0

Да, спасибо ... Я не контролирую БД, и я позволяю неправильному наименованию таблиц распространяться в моем коде. –

+0

Имена db не обязательно должны - очень легко изменить отображение вашего POCO в фактическую таблицу базы данных OnModelCreating: 'modelBuilder.Entity () .ToTable (« Пользователи »)'. Простое переименование F2 в классе Users затем распространит переименование в вашем проекте. То же самое с именами свойств - вы можете настроить любую из них. http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx – Leniency

ответ

41

Попробуйте изменить цикл для:

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

Вы звонили db.Entry(properties), так что вы пытаетесь прикрепить всю коллекцию сразу. DbContext.Entry (объект) expects a single object, а не коллекция.

+1

Спасибо .. Это избавило от этой ошибки, но добавлен «Объект с тем же ключом уже существует в ошибке objectstatemanager». Я смог получить помощь с этой ошибкой из http://stackoverflow.com/questions/8254854/object-with-same-key-already-exists-in-objectstatemanager. –

+0

Спасибо ... это было полезно –

8

Спасибо, Leniency, за ответ. Отлично.

Для чего это стоит, я предпочитаю, чтобы мои EntityState.Modified задания на одной строке (как у меня есть кратные), поэтому используются следующие LINQ:

properties.ForEach(p => db.Entry(p).State = EntityState.Modified); 
Смежные вопросы