【发布时间】:2019-11-20 23:01:02
【问题描述】:
我在 EF Core 中使用软删除方法。每个实体都有一个布尔值“Active”。我在实体配置层过滤所有活动实体。
我在软删除一对一关系时遇到问题。问题是,在尝试添加新关系后,我得到 外键约束冲突。因为数据库对软删除一无所知。它只是检查之前是否使用过外键。
我有一个 Customer 模型,它有 一个 Campaign 模型。
场景发生在下面;
- 创建客户实例 (Active=true)
- 创建一个 Campaign 实例 (Active=true)
- 将广告系列设置为客户的广告系列属性
- 保存更改
- 查询以获取上面保存的客户实体
- 访问其 Campaign 导航属性并设置其 Active=false
- 保存更改
- 查询以获取单个客户实体
- 创建一个新的 Campaign 实例 (Active=true)
- 将此设置为客户的广告系列属性
- 保存更改
第 11 步引发异常,例如“INSERT 语句与 FOREIGN KEY 约束冲突”
模型:
public class Customer{
public long Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
public Campaign Campaign {get; set;}
public long CampaignId { get; set; }
}
public class Campaign{
public long Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
public Customer Customer {get; set;}
}
实体配置(根据 IEntityTypeConfiguration 分开):
客户;
modelBuilder.HasKey(a => a.Id);
modelBuilder.HasQueryFilter(a => a.Active);
广告系列;
modelBuilder.HasKey(a => a.Id);
modelBuilder.HasOne(c => c.Customer)
.WithOne(c => c.Campaign)
.HasForeignKey<Customer>(c => c.CampaignId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.HasQueryFilter(a => a.Active);
在客户表中进行说明;
| Id | Name | Active | CampaignId
| --------- |:----------:| ------:| ----------
| 1 | Mark | 0 | 1
| 2 | James | 0 | 1
| 3 | Henna | 0 | 1
| 4 | Yay | 1 | 1
我真正需要的是这种一对一的关系。我不想要 2 个具有相同 CampaignId 的活跃客户。在我的业务逻辑中,可以手动或在插入具有相同 CampaignId 的新客户期间软删除客户。
对于这种情况,我应该采取什么方法?
【问题讨论】:
-
你的表(和表约束)是什么样的?
标签: sql-server entity-framework entity-framework-core ef-core-3.0