Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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# 如何在EF Core中级联更新?_C#_Entity Framework Core_.net 5 - Fatal编程技术网

C# 如何在EF Core中级联更新?

C# 如何在EF Core中级联更新?,c#,entity-framework-core,.net-5,C#,Entity Framework Core,.net 5,我正在尝试更新表及其相关实体,但子实体未更新。我不知道子实体是应该自动更新,还是需要手动更新。或者我不知道我的EF配置或数据库配置是否不正确 我的表是Template和TemplateFields。模板可以有多个templateField,但templateField只能有一个父模板。这是我的名片 以下是我在EF中的表格配置: public class TemplateConfiguration : EntityConfiguration<Template> { public

我正在尝试更新表及其相关实体,但子实体未更新。我不知道子实体是应该自动更新,还是需要手动更新。或者我不知道我的EF配置或数据库配置是否不正确

我的表是Template和TemplateFields。模板可以有多个templateField,但templateField只能有一个父模板。这是我的名片

以下是我在EF中的表格配置:

public class TemplateConfiguration : EntityConfiguration<Template>
{
    public override void Configure(EntityTypeBuilder<Template> builder)
    {
        base.Configure(builder);

        builder.HasMany(template => template.TemplateFields)
            .WithOne(field => field.ParentTemplate)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

public class TemplateFieldConfiguration : EntityConfiguration<TemplateField>
{
    public override void Configure(EntityTypeBuilder<TemplateField> builder)
    {
        base.Configure(builder);

        builder.HasOne(field => field.ParentTemplate)
            .WithMany(template => template.TemplateFields);
    }
}
以下是模板更新方法:

    public virtual async Task<Template> EditAsync(Template template)
    {
        var originalItem = await _dbContext.Template.FindAsync(template.Id);
        _dbContext.Entry(originalItem).CurrentValues.SetValues(template);
        await _dbContext.SaveChangesAsync();

        var newTemplate = await _dbContext.Template.FindAsync(template.Id);

        return newTemplate;
    }
最后是更新模板及其字段的有效负载(使用示例guid):

让我困惑的是,标准的EF方法
AddAsync()
将自动级联添加子模板字段,这告诉我级联更新应该是可能的。我想的是“_dbContext.Entry(originalItem).CurrentValues.SetValues(template);”仅获取已更改的值,由于我的模板表不包含指向TemplateField表的外键列,EF无法将其识别为已更改的值


这是正确的假设吗?如果是这样,有没有办法让层叠更新正常工作?

我发现
CurrentValues
只包含与数据库中的列相对应的属性。经过思考,我认为这是有道理的。当EF从数据库中填充模型时,它的深度不足以识别与
模板字段的关系

我的模型中的
TemplateFields
属性是一个引用/导航属性,在数据库中没有或不需要相应的列。因此,EF无法识别TemplateFields是否有任何更改

我发现在不同的更新方式和方法1上的帖子对我来说都很好。只需按如下方式分别更新每个字段:

var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    original.BusinessEntityId = updatedUser.BusinessEntityId;
    original.Email = updatedUser.Email;
    original.EmployeeId = updatedUser.EmployeeId;
    original.Forename = updatedUser.Forename;
    original.Surname = updatedUser.Surname;
    original.Telephone = updatedUser.Telephone;
    original.Title = updatedUser.Title;
    original.Fax = updatedUser.Fax;
    original.ASPNetUserId = updatedUser.ASPNetUserId;
    db.SaveChanges();
} 

使用
FindAsync()
加载模板时,请尝试首先在
DbSet
上调用
Include(t=>t.TemplateFields)
。这应该确保它们实际加载到内存中。不过,您可能必须使用
Single()
First()
而不是
FindAsync()
。我会尝试一下,谢谢
    public virtual async Task<Template> EditAsync(Template template)
    {
        var originalItem = await _dbContext.Template.FindAsync(template.Id);
        _dbContext.Entry(originalItem).CurrentValues.SetValues(template);
        await _dbContext.SaveChangesAsync();

        var newTemplate = await _dbContext.Template.FindAsync(template.Id);

        return newTemplate;
    }
{
    "name": "New Template",
    "fields": [
        {
            "name": "Title",
            "dataType": "text",
            "isSharedAcrossLanguages": false
        },
        {
            "name": "Content",
            "dataType": "image",
            "isSharedAcrossLanguages": true
        },
        {
            "name": "Header",
            "dataType": "text",
            "isSharedAcrossLanguages": false
        }
    ]
}
{
    "id": "32e2ff27-24e6-49d4-bea7-08d924513aa3",
    "name": "Edited Template",
    "fields": [
        {
            "id": "80072a3a-c717-4ab0-53ef-08d924513aae",
            "name": "Edited Title",
            "dataType": "text",
            "isSharedAcrossLanguages": false
        },
        {
            "id": "3865f8b1-0f3c-4edc-53f0-08d924513aae",
            "name": "Content",
            "dataType": "image",
            "isSharedAcrossLanguages": true
        },
        {
            "id": "57b5b7af-d265-4244-53f1-08d924513aae",
            "name": "Header",
            "dataType": "text",
            "isSharedAcrossLanguages": false
        }
    ]
}
var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    original.BusinessEntityId = updatedUser.BusinessEntityId;
    original.Email = updatedUser.Email;
    original.EmployeeId = updatedUser.EmployeeId;
    original.Forename = updatedUser.Forename;
    original.Surname = updatedUser.Surname;
    original.Telephone = updatedUser.Telephone;
    original.Title = updatedUser.Title;
    original.Fax = updatedUser.Fax;
    original.ASPNetUserId = updatedUser.ASPNetUserId;
    db.SaveChanges();
}