2015-07-13 5 views
0

Я развиваю интернет-магазин, используя структуру ASP.Net MVC 4.Entity framework не сохраняет свойство объекта

У меня есть объект категории - категории предметов в магазине (мужской одежды - например):

public class Category 
{ 
    [Required] 
    public long id { get; set; } 

    [Required] 
    public string name { get; set; } 

    public bool active { get; set; } 
    public bool displayOnTop { get; set; } 
    public bool showSubcategoriesItems { get; set; } 

    public Category parentCategory { get; set; } 

    public virtual Collection<Item> items { get; set; } 

    public Category() 
    { 
     this.items = new Collection<Item>(); 
    } 
} 

Существует свойство parentCategory - это означает, что эта категория входит в другую (Мужская одежда> Рубашки, например).

Для редактирования существующей категории я использую следующие действия:

[HttpPost] 
public ActionResult EditCategory(Category editedCategory, string parentCategorySelector) 
{ 
    UsersContext db = new UsersContext(); 

    Category existingCategory = db.categories.SingleOrDefault(c => c.id == editedCategory.id); 
    long parentCategoryId = (long)Int32.Parse(parentCategorySelector); 
    Category parentCategory = db.categories.SingleOrDefault(c => c.id == parentCategoryId); 

    if (existingCategory == null) return RedirectToAction("Index", "Admin"); 

    existingCategory.name = editedCategory.name; 
    existingCategory.active = editedCategory.active; 
    existingCategory.displayOnTop = editedCategory.displayOnTop; 
    existingCategory.showSubcategoriesItems = editedCategory.showSubcategoriesItems; 
    existingCategory.parentCategory = parentCategory; 

    db.Entry(existingCategory.parentCategory).State = EntityState.Modified; 
    db.SaveChanges(); 

    return View(existingCategory); 
} 

Все работает отлично, за исключением, когда я хочу установить parentCategory пустое значение - оно устанавливает нулевое значение в код, но нулевое значение не сохраняется в база данных - предыдущее значение все еще существует.

Но если я делаю это так:

[HttpPost] 
public ActionResult EditCategory(Category editedCategory, string parentCategorySelector) 
{ 
    UsersContext db = new UsersContext(); 

    Category existingCategory = db.categories.SingleOrDefault(c => c.id == editedCategory.id); 
    long parentCategoryId = (long)Int32.Parse(parentCategorySelector); 
    Category parentCategory = db.categories.SingleOrDefault(c => c.id == parentCategoryId); 

    if (existingCategory == null) return RedirectToAction("Index", "Admin"); 

    existingCategory.name = editedCategory.name; 
    existingCategory.active = editedCategory.active; 
    existingCategory.displayOnTop = editedCategory.displayOnTop; 
    existingCategory.showSubcategoriesItems = editedCategory.showSubcategoriesItems; 
    existingCategory.parentCategory = null; 

    db.Entry(existingCategory.parentCategory).State = EntityState.Modified; 
    db.SaveChanges(); 

    return View(existingCategory); 
} 

т.е. я установить его в нуль без условий, то сохраняются правильно.

Что я делаю неправильно?

ответ

1

Почему нет атрибута Key под Категория. ID? Если id является первичным ключом, он должен быть там.

Вы должны использовать Включить в load relate entities:

[HttpPost] 
    public ActionResult EditCategory(Category editedCategory, string parentCategorySelector) 
    { 
     using(UsersContext db = new UsersContext()) 
     { 
      Category existingCategory = db.categories.Include(c => c.parentCategory).SingleOrDefault(c => c.id == editedCategory.id); 
      long parentCategoryId = (long)Int32.Parse(parentCategorySelector); 
      Category parentCategory = db.categories.SingleOrDefault(c => c.id == parentCategoryId); 

      if (existingCategory == null) return RedirectToAction("Index", "Admin"); 

      existingCategory.name = editedCategory.name; 
      existingCategory.active = editedCategory.active; 
      existingCategory.displayOnTop = editedCategory.displayOnTop; 
      existingCategory.showSubcategoriesItems = editedCategory.showSubcategoriesItems; 
      existingCategory.parentCategory = parentCategory; 

      db.SaveChanges(); 

      return View(existingCategory); 
     } 
    } 

Пожалуйста, обратите внимание, как DbContext правильно утилизировать.

+0

Большое спасибо - это работает для меня! Действительно Include statement принимает строку, вместо lambda: Include ("parentCategory") –

+0

рад помочь! Включая, который принимает лямбда, находится в «System.Data.Entity», начиная с EF 4.1. –

Смежные вопросы