实体框架避免插入替身

本文关键字:插入 替身 框架 实体 | 更新日期: 2023-09-27 18:25:25

我想知道使用实体框架(5)是否可以实现我想要做的事情。简单地说,我有两个类

public class Value
{
  public int Id {get; set;}
  public int Content {get; set;}
  public virtual ICollection<Constraint> Constraints {get; set;}
}
public class Constraint
{
  public int Id {get; set;}
  public string Name {get; set;}
  public string Type {get; set;}
}

在我的业务逻辑中,如果对(Name,Type)相似,我会考虑两个类似的Constraint。在代码的某个地方,我将约束与值关联起来,比如:

Value v1 = new Value() { Content = 42 };
Constraint c1 = new Constraint() {Name = "A", Type = "B" };
v1.Constraints.Add(c1);
Value v2 = new Value() { Content = 43 };
Constraint c2 = new Constraint() {Name = "A", Type = "B" };
v2.Constraints.Add(c2);

然后,我有了持久层的另一部分,它负责在数据库中插入值:

ValueRepository.Insert(v1);
ValueRepository.Insert(v2);

在夫妇(Name,Type)的"constraint"表上有唯一的约束,我想避免在插入c2时出现插入错误我如何告诉EF将c2视为与c1相同

PS:我不能使用Constraint存储库来实例化Constraint实体。

实体框架避免插入替身

EF不能为您做到这一点,因为它是建立在实体不是可交换值的假设之上的。实体实例映射到行。每个不同的实例都是独立的。

因此,您需要确保不会重复插入。按偏好排序的技术:

  1. 更改应用程序的逻辑以不生成重复项
  2. 在创建实体实例之前,测试数据库是否已经存在(IOW运行查询)
  3. 处理异常

不要使用(3),因为很难仅处理这个错误。很可能你也会吞下不相关的食物。例如,您可能会将网络错误误认为该实体已经存在。