Asp.Net WebApi 2 PUT方法不更新嵌套集合

时间:2015-03-24 20:54:54

标签: c# entity-framework rest asp.net-web-api put

Asp.Net WebApi应用程序包含以下类Movie和Song。 (一对多关系)

public class Movie : PropertyChangedBase //(Implementation of INotifyPropertyChanged)
    {
        public Movie()
        {
            Songs = new ObservableCollection<Song>();
        }

        private int? _id;
        public int? Id
        {
            get { return _id; }
            set
            {
                _id = value;
                NotifyOfPropertyChange(() => Id);
            }
        }

        private string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                NotifyOfPropertyChange(() => Title);

            }

        }


        private ICollection<Song> _songs;
        public ICollection<Song> Songs
        {
            get { return _songs; }
            set
            {
                _songs = value;
                NotifyOfPropertyChange(() => Songs);
            }
        }
    }

    public class Song : PropertyChangedBase //(Implementation of INotifyPropertyChanged)
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set
            {
                _id = value;
                NotifyOfPropertyChange(() => Id);
            }
        }

        private string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                NotifyOfPropertyChange(() => Title);
            }
        }
    }

Web Api PUT方法:

// PUT: api/Movie/5
        [ResponseType(typeof(Movie))]
        public IHttpActionResult PutMovie(int id, Movie movie)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != Movie.ID)
            {
                return BadRequest();
            }

            db.Entry(Movie).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
            }
            return Ok(movie);
        }

创建新记录时,电影和歌曲集合成功创建。 可以编辑(更新)类Movie的值。

我调用PutMovie方法来更新现有记录。

问题: 1)将新歌曲添加到现有集合时,没有更新更新。没有错误但没有在DB中创建歌曲行。

2)更新Song中的现有值时,没有更新更新。没有错误,但在DB中没有修改歌曲值。

注意:我正在使用c#客户端来使用web api。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

来自here您可以阅读:

  

请注意,如果附加的实体引用了尚未跟踪的其他实体,则这些新实体将附加到Unchanged状态的上下文中 - 它们不会自动进行修改。如果您有多个需要标记为已修改的实体,则应分别为每个实体设置状态。

即您的歌曲被视为Unchanged。这就是他们没有更新的原因。

答案 1 :(得分:0)

当将.Net Core 2.x与Entity Framework Core 2.2.1一起使用时,我遇到了此问题。 我发现,除了将嵌套实体标记为“已修改”之外,我还必须将嵌套实体附加到DbContext,因为不会从class plan_car(models.Model): _inherit = 'plan.car' def read_group(self, cr, uid, domain, fields, groupby, offset=0, limit=None, context=None, orderby=False, lazy=True): res = super(plan_car, self).read_group(cr, uid, domain, fields, groupby, offset, limit=limit, context=context, orderby=orderby, lazy=lazy) if 'plan_payment_number' in fields: for line in res: if '__domain' in line: lines = self.search(cr, uid, line['__domain'], context=context) pending_value = 0 for current_account in self.browse(cr, uid, lines, context=context): pending_value += 1 line['plan_payment_number'] = pending_value return res 调用中自动跟踪它。

.Include()