如何将子实体更改为父实体?

时间:2019-07-16 11:49:38

标签: c# sql-server asp.net-core .net-core entity-framework-core

将子实体更改为父实体时遇到问题。 在我的Item类中,我具有“父项”的nagivation属性。 现在,我想更新我的孩子,并从父母那里“取消固定”。

我发现了这个:https://github.com/aspnet/EntityFrameworkCore/issues/13913

但是也许有一种“微妙的方式”来做我想要的事情。

public class Item
{
    public string Id { get; private set; }

    public Item Parent { get; set; }

    public List<Item> Children { get; private set; }
}

public class DataContext : IdentityDbContext<User>
{
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    {
    }

    public DbSet<Item> Items { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Item>().HasMany(x => x.Children).WithOne(x => x.Parent).OnDelete(DeleteBehavior.Cascade);

        base.OnModelCreating(builder);
    }
}

public async Task UpdateAsync(Item item)
{
    item.Parent = null;
    _context.Items.Update(item);

    await _context.SaveChangesAsync();
}

我想从以下位置更改(更新)

  • 项目1

    • 第2项

收件人:

  • 项目1

  • 第2项

但是将导航属性设置为null会导致删除子级。 另外,我想在删除父级时删除所有子级-它现在可以工作,并且我希望保持这种行为。

2 个答案:

答案 0 :(得分:2)

Item类必须具有ParentId才能在其与其父级之间创建关系。 如果添加它,然后将其设置为null,则可能会解决问题。

public class Item
{
    public string Id { get; private set; }

    public string ParentId {get; set;}
    public Item Parent { get; set; }

    public List<Item> Children { get; private set; }
}

答案 1 :(得分:1)

如果您不想删除实体,也可以尝试在保存之前设置实体的状态

var entry = _context.Entry(Item1);
entry.State = EntityState.Modified;

虽然不漂亮,但是应该可以完成工作。

EntityEntry.State Property

EntityEntry<TEntity> Class

DbContext.Entry Method