EF Core 6 升级 - 删除子对象同时删除父对象
EF Core 6 Upgrade - Deleting Child Object Also Deletes Parent
我有一个 EF Core 2.2 项目,我升级到了 EF Core 6。
存在用户为 EF 跟踪的实体上传一组新值的情况。
代码使用 SetState
将旧实体及其子实体标记为已删除,然后将值设置为新对象。
- 在 EF Core 2.2 中这有效。
- 现在在 EF Core 6 中,当调用
SaveChanges
时,将删除父 ConfigurationSettings
实体。
- 父对象未将其状态设置为在任何地方删除。
public void UpdateUserPreferences(UserPreferences newUserPreferences)
{
var selectedUserConfig = this.database.ConfigurationSettings
.Include(s => s.UserPreferences)
.ThenInclude(sc => sc.UserPreference)
.First(x => x.UserId == 1234);
selectedUserConfig.UserPreferences.UserPreference
.ToList()
.ForEach(up => this.database.SetState(up, EntityState.Deleted);
this.database.SetState(selectedUserConfig.UserPreferences, EntityState.Deleted);
selectedUserConfig.UserPreferences = newUserPreferences;
this.database.SaveChanges();
}
调用 SaveChanges
后,将保存一个新的 UserPreferences
实体以及我们想要的更新后的 UserPreference
子实体。但是,正在删除父 ConfigurationSettings
实体。
数据库快照配置为CascadeDelete
modelBuilder.Entity("ConfigurationSettings", c =>
{
c.HasOne("UserPreferences", "UserPreferences")
.WithMany()
.HasForeignKey("UserPreferencesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName( "FK_dbo.ConfigurationSettings.UserPreferences_userPreferencesId" );
}
我想要发生的是现有 ConfigurationSettings
实体未被删除,其 UserPreferencesId
更新为新保存的 UpdatedPreferences
实体。
没有抛出任何错误。
我似乎已经解决了这个问题,方法是在设置删除时删除对父 ConfigurationSettings
的引用,并在删除旧的 UserPreferences
之前添加新的 UserPreferences
语句。 .
public void UpdateUserPreferences(UserPreferences newUserPreferences)
{
var selectedUserConfig = this.database.ConfigurationSettings
.Include(s => s.UserPreferences)
.ThenInclude(sc => sc.UserPreference)
.First(x => x.UserId == 1234);
var selectedUserPreferences = selectedUserConfig.UserPreferences;
selectedUserConfig.UserPreferences = newUserPreferences;
selectedUserPreferences.UserPreference
.ToList()
.ForEach(up => this.database.SetState(up, EntityState.Deleted);
this.database.SetState(selectedUserPreferences, EntityState.Deleted);
this.database.SaveChanges();
}
我有一个 EF Core 2.2 项目,我升级到了 EF Core 6。 存在用户为 EF 跟踪的实体上传一组新值的情况。
代码使用 SetState
将旧实体及其子实体标记为已删除,然后将值设置为新对象。
- 在 EF Core 2.2 中这有效。
- 现在在 EF Core 6 中,当调用
SaveChanges
时,将删除父ConfigurationSettings
实体。 - 父对象未将其状态设置为在任何地方删除。
public void UpdateUserPreferences(UserPreferences newUserPreferences)
{
var selectedUserConfig = this.database.ConfigurationSettings
.Include(s => s.UserPreferences)
.ThenInclude(sc => sc.UserPreference)
.First(x => x.UserId == 1234);
selectedUserConfig.UserPreferences.UserPreference
.ToList()
.ForEach(up => this.database.SetState(up, EntityState.Deleted);
this.database.SetState(selectedUserConfig.UserPreferences, EntityState.Deleted);
selectedUserConfig.UserPreferences = newUserPreferences;
this.database.SaveChanges();
}
调用 SaveChanges
后,将保存一个新的 UserPreferences
实体以及我们想要的更新后的 UserPreference
子实体。但是,正在删除父 ConfigurationSettings
实体。
数据库快照配置为CascadeDelete
modelBuilder.Entity("ConfigurationSettings", c =>
{
c.HasOne("UserPreferences", "UserPreferences")
.WithMany()
.HasForeignKey("UserPreferencesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName( "FK_dbo.ConfigurationSettings.UserPreferences_userPreferencesId" );
}
我想要发生的是现有 ConfigurationSettings
实体未被删除,其 UserPreferencesId
更新为新保存的 UpdatedPreferences
实体。
没有抛出任何错误。
我似乎已经解决了这个问题,方法是在设置删除时删除对父 ConfigurationSettings
的引用,并在删除旧的 UserPreferences
之前添加新的 UserPreferences
语句。 .
public void UpdateUserPreferences(UserPreferences newUserPreferences)
{
var selectedUserConfig = this.database.ConfigurationSettings
.Include(s => s.UserPreferences)
.ThenInclude(sc => sc.UserPreference)
.First(x => x.UserId == 1234);
var selectedUserPreferences = selectedUserConfig.UserPreferences;
selectedUserConfig.UserPreferences = newUserPreferences;
selectedUserPreferences.UserPreference
.ToList()
.ForEach(up => this.database.SetState(up, EntityState.Deleted);
this.database.SetState(selectedUserPreferences, EntityState.Deleted);
this.database.SaveChanges();
}