EF 4.1 SaveChanges не обновляет навигационные или справочные свойства - PullRequest
16 голосов
/ 01 апреля 2011

Сначала я использую код и могу добавлять записи без проблем.База данных создана правильно и засевается без проблем.Но вызов SaveChanges () в моем действии «Изменить» обновляет только сущность, а не какие-либо свойства навигации или ссылки.

Упрощенная версия моей модели:

public class Contact : IMyBaseObject
{
    public Contact()
    {
       this.Delete = false;
       this.ContactTypes = new HashSet<ContactType>();
    }

    public int Id {get; set;}

    public string Name {get;set;}

    public bool Delete {get;set;}

    public virtual ICollection<ContactType> ContactTypes { get; set; }

    public virtual USState USState { get; set; }

}

public class ContactType : MyBaseObject
{
    public ContactType()
    {
    }

    public int Id {get; set;}

    public string Name {get;set;}

    public virtual ICollection<Contact> Contacts {get;set;}
}

public abstract class Territory : MyBaseObject
{
    public int Id {get; set;}

    public string Name {get;set;}

    public string Code {get;set;}
}

public class USState : Territory
{
    public USState()
    {
    }

    // Navigation properties
    public virtual ICollection<Contact> Contacts { get; set; }
}

Я не буду включатькод, но у меня есть некоторые пользовательские привязки модели происходит.Мое действие «Изменить» (с использованием MVC 3) не заполнялось свойствами ContactType или USState.Привязка правильно возвращает полностью заполненный объект Contact с правильными значениями из формы.

Если я правильно понимаю EF 4.1, мне нужно только сделать следующее, чтобы сохранить изменения в базе данных при сохранении моего объекта Contact:

if(ModelState.IsValid)
{
    context.Entry(contact).State = EntryState.Modified;
    context.SaveChanges();
}

Однако при этом обновляются только примитивные свойства.В вышеприведенном примере я пропустил несколько вещей: я использую транзакцию, блок try catch и проверяю, является ли она новой записью.

Я использовал SQL Profiler и могу подтвердить, что обновление запрашиваетдля таблиц ContactType и Territory не отправляется на сервер базы данных.

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

    context.Entry(contact).Collections("ContactTypes").EntityEntry.State = EntityState.Modified;
    context.Entry(contact).Reference("USState").EntityEntry.State = EntityState.Modified;

Я могу ошибаться, но я почти уверен, что мой код работал под CTP5.

Есть идеи?На данный момент, я не уверен, как мне подойти к отладке.

Спасибо, Стив

Ответы [ 4 ]

1 голос
/ 19 мая 2012

Попробуйте это:

  context.Entry(contact.USState ).State = EntityState.Modified; //////
0 голосов
/ 04 ноября 2014

я уверен, что больше кода поможет лучше определить проблему, особенно код привязки модели.но одна вещь, с которой, я думаю, вы уже знакомы, это то, что вам нужно получить доступ к этим свойствам навигации (каким-то образом), чтобы EF мог автоматически загружать их. потому что вы отметили свои свойства nav как виртуальные, вы разрешаете EF создавать прокси и переопределятьваши nav-свойства, чтобы разрешить Lazy Loading.

0 голосов
/ 19 июля 2014

Предоставленного кода может быть недостаточно. Лучше увидеть код, как были добавлены свойства навигации в коде. Поскольку даже если родительский класс был помечен как измененный, это не означает, что связанные свойства навигации также помечены как добавленные или измененные. Самый быстрый способ - включить отладчик в том месте, где был вызван .SaveChanges, а затем посмотреть на переменную контекста, посмотреть свойства «Local», узнать, есть ли свойства навигации, а также добавить или изменить их модальное состояние, а затем гораздо легче будет сказать, что нужно сделать.

0 голосов
/ 02 сентября 2011

Предполагая, что ваши объекты DAL / Коллекция взяты из Entity Framework, сделайте это;

Contact.ContactTypes.Load();

Это обновит связанный список coltactTypes из базового источника.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...