【问题标题】:Entity Framework avoid inserting doubles实体框架避免插入双打
【发布时间】:2013-07-29 13:04:23
【问题描述】:

我想知道我正在尝试做的事情是否可以使用实体框架 (5)。 简单来说,我有 2 个类

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;}
}

在我的业务逻辑中,如果这对(名称,类型)相似,我会考虑两个相似的约束。 在代码中的某处,我将约束与值相关联,例如:

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);

对夫妇(名称,类型)的“约束”表具有唯一约束,我想避免在插入 c2 时出现插入错误。 如何告诉 EF 将 c2 视为与 c1 相同?

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

【问题讨论】:

  • 在将数据插入数据库时​​给出Id的值。
  • Constraint 还有哪些其他属性会导致存在多个具有相同键值的对象?当有两个具有相同键的约束时,您打算做什么 - 通知用户并要求他们更改输入,或者抛出不同的异常而不是唯一键冲突?或者你想删除除一个以外的所有欺骗?
  • 我不想在我正在尝试做的数据库表中保留相同约束的重复项。除此之外,插入后我希望 c1 指向 v1 和 v2 值,而不仅仅是 v1。

标签: c# .net entity-framework-5


【解决方案1】:

EF 无法为您执行此操作,因为它建立在实体不是可交换价值的假设之上。实体实例映射到行。每个不同的实例都是独立的。

因此,您需要确保不要重复插入。按优先顺序排列的技术:

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

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

【讨论】:

  • 感谢您的回答。我正在考虑添加表插入触发器以避免插入双精度,但我不知道 c2 实体的状态是什么。
  • 不要更改EF背后的数据。它会开始表现得很奇怪,因为它认为 c2 在数据库中,而实际上却不在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多