Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将子实体更改为父实体?_C#_Sql Server_Asp.net Core_.net Core_Entity Framework Core - Fatal编程技术网

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

C# 如何将子实体更改为父实体?,c#,sql-server,asp.net-core,.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,.net Core,Entity Framework Core,我在将子实体更改为父实体时遇到问题。 在我的Item类中,我有一个“父项”的Nagiviation属性。 现在我想更新我的孩子并从父母那里“取消绑定” 我发现: 但也许有一种“巧妙的方式”来做我想做的事 public class Item { public string Id { get; private set; } public Item Parent { get; set; } public List<Item> Children { get; pr

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

我发现:

但也许有一种“巧妙的方式”来做我想做的事

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();
}
公共类项目
{
公共字符串Id{get;private set;}
公共项父项{get;set;}
公共列表子项{get;private set;}
}
公共类DataContext:IdentityDbContext
{
公共数据上下文(DbContextOptions):基本(选项)
{
}
公共数据库集项{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.Entity().HasMany(x=>x.Children).WithOne(x=>x.Parent).OnDelete(DeleteBehavior.Cascade);
基于模型创建(生成器);
}
}
公共异步任务UpdateAsync(项)
{
item.Parent=null;
_context.Items.Update(item);
wait_context.SaveChangesAsync();
}
我希望更改(更新)来自:

  • 项目1

    • 项目2
致:

  • 项目1

  • 项目2

但在导航属性上设置null会导致删除子项。
此外,当我删除父项时,我想删除所有子项-它现在起作用,我想保留此行为。

项类必须具有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; }
}
公共类项目
{
公共字符串Id{get;private set;}
公共字符串ParentId{get;set;}
公共项父项{get;set;}
公共列表子项{get;private set;}
}

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

var entry = _context.Entry(Item1);
entry.State = EntityState.Modified;
它不漂亮,但它应该能起作用


EF仍然删除对象。添加ParentId属性有效。