【问题标题】:Asp.Net WebApi 2 PUT method not updating nested collectionAsp.Net WebApi 2 PUT 方法不更新嵌套集合
【发布时间】:2015-05-28 08:35:52
【问题描述】:

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);
        }

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

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

问题: 1) 向现有收藏添加新歌曲时,没有更新任何更改。没有错误,但没有在 DB 中创建歌曲行。

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

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

请帮我解决这个问题。

【问题讨论】:

  • 您收到DbUpdateConcurrencyException 了吗?如果是这样,则说明您遇到了导致保存失败的问题。简单地放置一个空的 catch 来隐藏异常不会使保存神奇地成功......
  • 对不起。我已经处理了异常,但我没有在上面的例子中包含代码。

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


【解决方案1】:

我在使用 .Net Core 2.x 和 Entity Framework Core 2.2.1 时遇到了这个问题。 我发现除了将嵌套实体标记为已修改之外,我还必须将嵌套实体附加到 DbContext,因为它没有被 .Include() 调用自动跟踪。

db.Attach(movie.Song);
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();

【讨论】:

    【解决方案2】:

    来自here你可以阅读:

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

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

    【讨论】:

    • 谢谢。你的意思是这样的: db.Entry(Song).State = EntityState.Modified; ?
    • 确实如此。你必须解析树。
    • 感谢它的工作正常。顺便说一句,是否有任何配置可以自动跟踪 EF 的变化?
    • 跟踪,你的意思是审计数据库?
    • 我的意思是,有没有其他方法可以设置 EntityState 而无需为每个实体手动设置 EntityState。你知道context.Configuration.AutoDetectChangesEnabled = true的用法吗?
    猜你喜欢
    • 2018-08-10
    • 2016-03-18
    • 2015-05-06
    • 2016-02-13
    • 2021-12-05
    • 1970-01-01
    • 2021-11-04
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多