实体框架避免插入替身
本文关键字:插入 替身 框架 实体 | 更新日期: 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不能为您做到这一点,因为它是建立在实体不是可交换值的假设之上的。实体实例映射到行。每个不同的实例都是独立的。
因此,您需要确保不会重复插入。按偏好排序的技术:
- 更改应用程序的逻辑以不生成重复项
- 在创建实体实例之前,测试数据库是否已经存在(IOW运行查询)
- 处理异常
不要使用(3),因为很难仅处理这个错误。很可能你也会吞下不相关的食物。例如,您可能会将网络错误误认为该实体已经存在。