@SMARTi

Entity Framework 6, не обновляется внешний ключ в таблице. Как исправить?

Создал простенькую объектную модель с продуктами и категориями:
public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual Category Category { get; set; }
    }

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

VS помогла сгенирировать контролер с использованием odata ProductController, он содержит метод для обновления данных:
// PUT odata/Product(5)
        public IHttpActionResult Put([FromODataUri] int key, Product product)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (key != product.Id)
            {
                return BadRequest();
            }
            
            db.Entry(product).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ProductExists(key))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return Updated(product);
        }

В этот метод приходит объект Product с измененными Category и Name,
но в итоге в базе в таблице Product Name изменяется, а Category_Id нет, без каких-либо ошибок.
  • Вопрос задан
  • 2860 просмотров
Решения вопроса 2
masterL
@masterL
Эффективность и продуктивность
Чтобы избежать проблем при работе с отключенными сущностями (Disconnected Entities) вам нужно использовать не только Navigation Properties но и связи на основе внешнего ключа ( foreign key associations), для этого сделайте вашу модель такой:

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


Подробнее можно прочитать в книге "Programming Entity Framework" Julia Lerman, 85 страница раздел "Working with Relationships with and Without Foreign Keys"
Ответ написан
@asdz
Вам просто нужно присвоить объект свойству навигации, либо, как сказал masterL , перейти от независимых сопоставлений к сопоставления на основе внешнего ключа, и тогда, вы просто можете задать значение ключа для изменения свойства. Здесь, описаны варианты работы с внешними ключами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@issa05
Вам все правильно написали, создаете поле CategoryId, при редактировании этому полю присваиваете новое значение - id другой категории и сохраняете изменения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы