none
Не полностью обновляется сущность в entity framework code first. RRS feed

  • Вопрос

  • Есть такой код в контроллере:
     var textLink = Mapper.Map<TextLink>(editViewModel);
                    textLink.Sponsor = _dbContext.Set<Sponsor>.GetById(editViewModel.IdSponsor);
                    _dbContext.Entry(textLink).State=EntityState.Modified;
                    _dbContext.Save();
    Сущности Sponsor и TextLink связаны отношением 1 - *. При сохранении значения полей у _texLink меняются, а ссылка на Sponsor нет. Подскажите что можно сделать? 
    16 апреля 2013 г. 13:26

Ответы

  • Сделал так:

    public class TextLinkController:Controller{
    
       private Db _dbContext =new Db();
    
       [HttpPost]
       public ActionResult Edit(EditViewModel editViewModel){
    
           var textLink = _dbContext.Set<TextLink>().Find(editViewModel.Id);
                    textLink.Sponsor = _dbContext.Set<Sponsor>.GetById(editViewModel.IdSponsor);
                    _dbContext.Entry(textLink).State=EntityState.Modified;
                    _dbContext.Save();
         return RedirectToAction("Index");
       }
    }

    Но это меня лишает возможности использовать AurtoMapper для копирования свойств из editViewModel в _textLink.

    • Помечено в качестве ответа Yoyrel 18 апреля 2013 г. 13:21
    18 апреля 2013 г. 13:21

Все ответы

  • Не совсем понял, попробуйте более развёрнуто.
    16 апреля 2013 г. 15:22
    Модератор
  • Попробую сократить. Есть две сущности:

        public class Sponsor : Entity
        {
            [Required]
            public string Name { get; set; }
    
            [Required]
            public DateTime DateTime { get; set; }
    
            public virtual ICollection<TextLink> TextLink{get;set;}
        }
    
        public class TextLink : Entity
        {
            [Required]
            public string Url{get;set;}
    
            [Required]
            public string Text { get; set; }
    
            public virtual Sponsor{get;set;}
        }
    

    Такой контроллер:

    public class TextLinkController:Controller{
    
       private Db _dbContext =new Db();
    
       [HttpPost]
       public ActionResult Edit(EditViewModel editViewModel){
    
           var textLink = Mapper.Map<TextLink>(editViewModel);
                    textLink.Sponsor = _dbContext.Set<Sponsor>.GetById(editViewModel.IdSponsor);
                    _dbContext.Entry(textLink).State=EntityState.Modified;
                    _dbContext.Save();
         return RedirectToAction("Index");
       }
    }

    Поля textLink обновляются как и было отредактированно в форме, а вот Sponsor не меняется, а вот если получить textLink из _dbContext по Id и вручную изменить Sponsor, то сохранение происходит.


    • Изменено Yoyrel 16 апреля 2013 г. 15:53
    16 апреля 2013 г. 15:52
  • Уже намного понятней. "Поля textLink обновляются как и было отредактированно в форме, а вот Sponsor" - т.е. данные в Sponsor тоже должны были прийти с формы и не пришли или из базы не приходят?
    18 апреля 2013 г. 6:00
    Модератор
  • Да все так, еще должен меняться Sponsor в котором находится TextLink. Вот сдесь он меняется:

      textLink.Sponsor = _dbContext.Set<Sponsor>.GetById(editViewModel.IdSponsor);

    Но реально замены не происходит(из базы Sponsor приходит), если не указывать вообще, выбрасывается исключение. Такое ощущение что это свойство получается только для чтения.

    18 апреля 2013 г. 7:39
  • Ну что нет идей?
    18 апреля 2013 г. 9:09
  • Сделал так:

    public class TextLinkController:Controller{
    
       private Db _dbContext =new Db();
    
       [HttpPost]
       public ActionResult Edit(EditViewModel editViewModel){
    
           var textLink = _dbContext.Set<TextLink>().Find(editViewModel.Id);
                    textLink.Sponsor = _dbContext.Set<Sponsor>.GetById(editViewModel.IdSponsor);
                    _dbContext.Entry(textLink).State=EntityState.Modified;
                    _dbContext.Save();
         return RedirectToAction("Index");
       }
    }

    Но это меня лишает возможности использовать AurtoMapper для копирования свойств из editViewModel в _textLink.

    • Помечено в качестве ответа Yoyrel 18 апреля 2013 г. 13:21
    18 апреля 2013 г. 13:21