2016-08-08 2 views
0

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

Но когда я пытаюсь сохранить его, как показано ниже (пример 1 и 2), он не сохраняет прикрепленные категории в базе данных.

Что мне не хватает?

public bool SaveProduct(Product product) 
{ 
    //Try 1 
    foreach(var item in product.Categories) { 
      db.Entry(item).State = item.Id == 0 ? 
       EntityState.Added : 
       EntityState.Modified; 
     } 
    //Try 2 
    foreach(Category category in product.Categories) { 
     db.Entry(category).State = EntityState.Modified; 
     db.Category.Attach(category); 
    } 
    return Save(); 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public List<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

} 
+0

Что делает метод 'Save()'? –

+0

Его просто 'db.SaveChanges();' с loggin и обработкой ошибок. – Niklas

ответ

1

Заказ является вашей проблемой.

Сначала вы установили запись какого-либо объекта категории в свой контекст на Модифицированный (который должен получить объект с тем же ConcurrencyTokens из базы данных и установить измененное состояние), и затем привязать ваш текущий объект к контексту (очевидно, в неизмененном состоянии).

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

Попробуйте изменить порядок Attach() и State = Modified.

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