Entity Framework, создающий нулевую запись в БД при POST

#asp.net-mvc-3 #entity-framework #linq-to-entities

#asp.net-mvc-3 #entity-framework #linq-to-entities

Вопрос:

У меня есть простая форма, которая создает категории с именем и списком присвоенных им автомобилей.

Все работает нормально, за исключением того факта, что для каждой записи в БД я получаю вторую запись до того, как она станет нулевой везде, кроме родительского идентификатора бренда.

 [HttpPost]
public ActionResult AddNewCategory(AddNewCategoryPostViewModel categoryInfo)
{
    var brand = _repository.GetBrandById(categoryInfo.BrandId);
    if (categoryInfo.Name == null || categoryInfo.Cars == null)
    {
        if (categoryInfo.Name == null)
        {
            ModelState.AddModelError("Name", "The name cannot be empty.");
        }

        if (categoryInfo.Cars == null)
        {
            ModelState.AddModelError("Cars", "At least one car must be selected.");
        }

        var cars = _insplib.GetDevCategorysForProject((int)brand.Id);

        ViewBag.Cars = cars;
        ViewBag.Selectedcars = categoryInfo.Cars;

        return View(new Category()
                        {
                            Brand = brand
                        });
    }

    var category = new Category()
                        {
                            DateEntered = DateTime.Now,
                            IsArchived = false,
                            Name = categoryInfo.Name,
                            BrandId = categoryInfo.BrandId
                        };

    _repository.AddOrUpdateCategory(category);

    // more code here added to add the cars, but not relevant to this issue.

    return RedirectToRoute("Category", new { brand = category.Brand.ShortName, categoryId = category.Id });
}
  

Мой метод репозитория:

 public Category AddOrUpdateCategory(Category category)
{
    if (category.Id == 0)
        _context.AddToCategorys(category);

    _context.SaveChanges();

    return category;
}
  

Как вы можете видеть, это довольно простой пост, но каждый раз, когда я создаю категорию, я получаю две записи:

 ID  Name    DateEntered IsArchived  
5   NULL    NULL    NULL    4
6   NewCategory 10/6/2011   False   4
  

Мой трюк заключался в том, чтобы просто просмотреть таблицу и удалить любую категорию, которая имеет нулевые значения в Name . Но это, очевидно, не решает актуальную проблему.

Комментарии:

1. Получает ли ваше соответствие, и return View(new Category{}); я бы сказал, что это запись, которая сохраняется. Вы могли бы проверить мою теорию, установив одно из других свойств и посмотреть, отображается ли оно в пустой записи.

2. Возможно, вы вызываете свой Post метод дважды. Вы проверили это с помощью точки останова?

3. @Jayantha, да, это уже проверено, и этого не происходит.

4. @ChrisSainty, ты прав! Это моя проблема. Я не передаю новую категорию, а вместо этого использую ViewBag для передачи только объекта бренда, который мне нужен для заголовка и идентификатора на моей странице! Спасибо! Укажите свое решение в качестве ответа, и я отмечу его как таковой 🙂

Ответ №1:

Согласно комментариям, на самом деле ваш GET будет создавать пустую запись, когда она передает a new Category() в представление.
Некоторые из ORM обнаруживают новые объекты и добавляют их в ваш контекст для вас. Что полезно создает запутанные проблемы, подобные этой.