我有一个父对象,如下所示:

public class Event
{
    public int Id { get; private set; }
    public Interest? Interest { get; set; }
}

public class Interest
{
    public int Id { get; private set; }
    // no List<Event> Events { get; set; }
}

因此,每个Event个对象有0个或1Interest个对象.许多事件可能指向相同的兴趣.

当我删除一个兴趣对象时,我希望数据库中的每个Event.Interest都被设置为空,其中该兴趣是正在删除的兴趣.有没有办法在EF中声明这一点?

或者我是否需要读取所有这些事件对象,将它们的兴趣设置为空,然后保存它们?

或者,有没有办法通过实体框架传递一条SQL语句,将当前设置为要删除的Interest.Id的所有内容的底层Event.InterestId设置为空?

推荐答案

您可以在配置关系时设置级联选项-请参阅Cascade Delete文档.类似于以下内容:

modelBuilder.Entity<Event>()
    .HasOne<Interest>(e => e.Interest)
    .WithOne()
    .HasForeignKey<Interest>("EventId")
    .OnDelete(DeleteBehavior.SetNull) // Or DeleteBehavior.ClientSetNull
    .IsRequired(false);

备注:

  • 许多事件可能指向相同的兴趣.

    这意味着一对多,尽管设置不会有太大变化:

    modelBuilder.Entity<Event>()
         .HasOne<Interest>(e => e.Interest)
         .WithMany()
         .OnDelete(DeleteBehavior.SetNull) // Or DeleteBehavior.ClientSetNull
         .IsRequired(false);
    
  • EF Core: One-to-one relationships

  • EF Core: One-to-many relationships

  • 我建议以任何一种方式公开导航属性(这也将允许应用[DeleteBehavior(DeleteBehavior.Cascade)]属性)

Csharp相关问答推荐

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

自定义JsonEditor,用于将SON序列化为抽象类

哪个nuget包含SecurityStampValidatorOptions

将委托传递到serviceccollection c#web API

解析需要HttpClient和字符串的服务

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

如何在Windows 11任务调度程序中每1分钟重复一次任务?

从ASP.NET Core中的枚举字段填充 Select 选项时,将默认的第一个选项添加为 Select 元素

如何解决提交按钮后 Select 选项错误空参照异常

如何让NLog停止写入冗余信息?

RabbitMQ群集的MassTransit配置问题

.NET 6:如何防止系统生成的日志(log)?

无法使用[FromForm]发送带有图像和JSON的多部分请求

毛伊岛.NET 8图片不再适合按钮

如何在使用Google.Drive.apis.V3下载文件/文件夹之前压缩?

如何在更新数据库实体时忽略特定字段?

我想我必须手动使用res1(字符串形式的PowerShell哈希表)

无法创建工具窗口(用于VBIDE、VBA的COM加载项扩展)

XmlSerializer在遇到XML属性(命名空间)时崩溃

从列表中跳过和获取条目的优雅方式