C# 如何在EF Core中级联更新?
我正在尝试更新表及其相关实体,但子实体未更新。我不知道子实体是应该自动更新,还是需要手动更新。或者我不知道我的EF配置或数据库配置是否不正确 我的表是Template和TemplateFields。模板可以有多个templateField,但templateField只能有一个父模板。这是我的名片 以下是我在EF中的表格配置: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
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();
}