将子实体更改为父实体时遇到问题。 在我的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
收件人:
项目1
第2项
但是将导航属性设置为null会导致删除子级。 另外,我想在删除父级时删除所有子级-它现在可以工作,并且我希望保持这种行为。
答案 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;
虽然不漂亮,但是应该可以完成工作。