【问题标题】:Entity Framework Code First - Delete related items from a tableEntity Framework Code First - 从表中删除相关项
【发布时间】:2022-01-18 14:47:13
【问题描述】:

我首先使用实体​​框架代码。

我有多个需要审计跟踪的类(例如 Car、Van)。 当对此类的实例进行更改时,将更新审计试验。 这些类都继承自父级(车辆),并且都使用 GUID 作为 ID。

我的 Audit Trail 类引用了此 GUID 和一条审核消息。

如何配置我的域对象,以便在删除 Car 时删除所有相应的 Audit Trail 项目? 有没有办法在域模型中执行此操作,我需要在其他地方进行配置,还是应该在每次删除操作后清理 Audit Trail 存储库?

public class Car : Vehicle
{
    public string CarProperty { get; set; }
}

public class Vehicle
{
    public Guid Id { get; set; } = Guid.NewGuid();
    public string ItemName { get; set; }
}

public class AuditTrail
{
    public Guid Id { get; set; } = Guid.NewGuid();

    public string AuditNote { get; set; }

    public Guid VehicleId { get; set; }
}

【问题讨论】:

  • 级联删除选项
  • 考虑到代码的结构,级联删除是否是一个选项?

标签: c# entity-framework ef-code-first


【解决方案1】:

你有两个选择:

  1. 您可以保留现有的 AuditTrail 类,其中 VehicleId 指向 Car 或 Van 等,但没有任何外键约束,因为它将能够指向数据库中的多个表(您可能想要记录哪个表 AuditTrail 用于)。这很整洁,因为您不会有太多字段,但意味着您需要编写代码来删除相应的 Vehicle 时的 AuditTrails。

  2. 您可以为与 AuditTrail(CarId、VanId 等)相关的每个表创建一个单独的字段,然后使用级联删除规则为每个关系创建一个外键约束,该规则将自动删除具有相应车辆的 AuditTrail。这意味着为您添加的每个新车辆表添加一个新字段和约束,并创建代码以在创建 AuditTrail 时处理所有不同类型。

     public class Car : Vehicle
     {
         public string CarProperty { get; set; }
         public IList<AuditTrail> AuditTrails { get; set; }
     }
    
     public class Vehicle
     {
         public Guid Id { get; set; } = Guid.NewGuid();
         public string ItemName { get; set; }
     }
    
     public class AuditTrail
     {
         public Guid Id { get; set; } = Guid.NewGuid();
    
         public string AuditNote { get; set; }
    
         [ForeignKey(nameof(CarId))]
         public Car Car { get; set; }
         public Guid? CarId { get; set; }
     }
    

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多