ASP.NET MVC 3, Entity Framework 4. Обновление объекта по отношению ко многим - PullRequest
2 голосов
/ 04 сентября 2011

Я хочу обновить сообщение и изменить отношения с уже созданными ранее категориями. Почтовый объект имеет ICollection категорий. Но категории не изменены. Кажется, что EF не отслеживает отношения сущностей. Кстати у меня нет проблем с созданием новых постов с присвоением категорий.

Есть две модели:

public class Post
{
    public virtual  int PostId { get; set; }
    ...
    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public virtual int CategoryId { get; set; }
    ...
    public virtual ICollection<Post> Posts { get; set; }
}

Контроллер Add, работающий должным образом:

public ActionResult Create(Post model)
{
    var c = Request.Form["CategoryID"].Split(',');
    model.Categories = c.Select ... .ToList(); //here I assign relationships with attached objects
    _repository.Add(model);
    _repository.SaveChanges();
   ...         
}

Репозиторий Добавить метод:

T IRepository.Add<T>(T entity)
{
   return Set<T>().Add(entity);
}

Контроллер редактирования не сохраняет измененные категории, только сообщения.

public ActionResult Edit(Post model)
{
   var c = Request.Form["CategoryID"].Split(',');
   model.Categories = c.Select ... .ToList(); //here I update relationships with attached objects
   _repository.Attach(model);
   _repository.SaveChanges();
   ...
}

Метод редактирования репозитория:

T IRepository.Attach<T>(T entity)
{
  var entry = Entry(entity);
  entry.State = System.Data.EntityState.Modified;
  return entity;
}

Я что-то не так делаю?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 31 марта 2012

Решение:

public ActionResult Edit(Post model)
    {
        model = _repository.Attach(model);
        var post = _repository.Posts.Include(p => p.Categories).Single(s => s.PostId == model.PostId);
        post.Categories.Clear();
        model.Categories = GetCategories();
        _repository.SaveChanges();
    }
  1. Сначала прикрепите объект (EntityState.Modified)
  2. Запросите объект с помощью метода «Включить» или другого метода для загрузки связанных объектов
  3. Очистить существующие отношения.Мне это не нравится, но я не могу найти другой способ
  4. Назначить новые отношения из представления и SaveChanges.
1 голос
/ 04 сентября 2011

Entity Framework не будет отслеживать изменения отношений таким образом.Он только отслеживает состояния объектов, поэтому правильным способом будет загрузить требуемую «публикацию» со всеми категориями, а затем изменить загруженную коллекцию - таким образом, изменения будут отражены во всех состояниях объектов.

0 голосов
/ 17 мая 2016

удапте объект

 string ImgID = CompCert.CertID.ToString() + "ComID" + CompId + ext;
                        CompCert.CertImageFile = ImgID;
                        db.ObjectStateManager.ChangeObjectState(CompCert, EntityState.Modified);
                        db.SaveChanges();
0 голосов
/ 04 сентября 2011

Управление коллекцией категорий, т. Е. (Добавление, удаление, редактирование) в классе записей.Если вы используете тот же DbContext, то изменения будут отслеживаться.Это должно работать.

добавить категорию

_post.Categories.Add(category1);

удалить категорию

_post.Categories.Remove(category1);

редактировать категорию

 _post.Categories[0].Name = "TEST Name";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...