Blazor Server EF Core:相关数据(一对多关系)不保存

问题描述 投票:0回答:1
添加新

SalesItemNecessities 时会创建

Activity
。但是,更新父级
SalesItemNecessities
时,
Activity
不会更新。大家有什么建议吗?

我有两个型号:

public class Activity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<SalesItemNecessity>? SalesItemNecessities { get; set; }
}
public class SalesItemNecessity
{
    [Key]
    public int Id { get; set; }
    public SalesItem SalesItem { get; set; }
    public int SalesItemId { get; set; }
    public int Amount { get; set; }
    public Activity Activity { get; set; }
    public int ActivityId { get; set; }
}

当我更改

activity
的数据时,我还可以添加、更改或删除
SalesItemNEcessities
。当我点击“保存”时,我希望更新我的
activity
,但是 我的
SalesItemNecessities
。然而,后者不会发生。

public async Task<bool> UpdateAsync(Activity objActivity)
{
    try
    {
        using (var _db = _factory.CreateDbContext())
        {
            _db.Entry(objActivity).State = EntityState.Modified;
            _db.Set<Activity>().Update(objActivity);
            await _db.SaveChangesAsync();
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

当我点击保存时,我的

Activity
的数据在数据库中更新(例如名称),但我的
SalesItemsNecessity
未更新。添加的项目不会创建,更改的项目不会更新,删除的项目不会删除。

我发现这种行为很奇怪,因为我可以使用下面的代码添加一个新的

activity
SalesItemNecessity
。任何
SalesItemNecessity
都会与刚刚创建的活动 EF Core 的
ActivityId
添加到数据库中。

public async Task<bool> AddAsync(Activity objActivity)
{
    try
    {
        using (var _db = _factory.CreateDbContext())
        {
            _db.Activities.Add(objActivity);
            await _db.SaveChangesAsync();
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

任何人都知道为什么我无法以这种方式更新/删除我的

SalesItemNecessities
,但我可以在创建新的
Activity
时添加它们。先谢谢了!

c# entity-framework entity-framework-core blazor blazor-server-side
1个回答
0
投票

如果创建 DbContext,将 objActivity 实体状态设置为Modified,然后更新 objActivity,则只有它会被更新,因为 SalesItemNecessities 集合仍然保持在 Unchanged 状态。

正确的做法是:

  1. 创建_dbDbContext;
  2. 加载objActivity;
  3. 加载 objActivity 集合: _db.Entry(objActivity).Collection(c => c.SalesItemNecessities).Load();
  4. 修改 objActivity,同时更改其集合的一些元素;
  5. _db.Update(objActivity);
  6. _db.SaveChanges();
© www.soinside.com 2019 - 2024. All rights reserved.