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。
请帮我解决这个问题。
答案 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()