【发布时间】:2011-04-20 07:34:23
【问题描述】:
我最近开始使用实体框架,检查我是否真的需要向数据库添加新记录有点痛苦。
如果我需要添加到数据库的 Entity 已经在它上面,我会知道,因为我在插入它之前会进行查询,如果它存在,那么我会保留该实例,因为我需要在某些关系中使用它。
假设我的实体名称是Book。
当一个实体不在数据库中时,问题就出现了,我这样做了:
Book b = //...
modelContainer.AddToBooks(b);
我可以轻松做到:
modelContainer.SaveChanges()
每次我添加一个新实体(无论它是什么实体),这都会正常工作,因为我一次插入一种条目,并检查它是否已经在数据库中,我赢了'没有重复问题。
但如果我想避免如此频繁地拨打SaveChanges() 怎么办?
在这个问题中:Is is possible to check if an object is already attached to a data context in Entity Framework?,问题的作者提供了一种在我的情况下对我有帮助的方法,但是如果我将Add 对象指向上下文而不是Attaching 它,则它不起作用。
我的问题(可能是两个,但非常相关)是:Add 和 Attach 有什么区别以及如何解决我的问题?
编辑:
这是我遇到的问题的一个示例。
我有一个实体 Result,它与另外两个实体有关系:Trainer 和 Horse。
我从外部来源获取数据,因此我必须手动创建所有实体。
每次我需要插入一个新的Trainer,我都会这样做:
var trainer = Trainer.CreateTrainer(Id)
然后我查询数据库以查看具有Id 的培训师是否已经在数据库中。如果是,那么我将trainer 变量替换为数据库中的变量。
如果不是,我可以在这里做两件事:
- 将训练器附加到上下文(我可以使用密钥检查它是否已经存在)
- 将培训师添加到上下文中(使用
AddToTrainers(...))
Horse 的过程相同。
现在,当我需要创建一个新的 Result(其中包含一个 Trainer 和一个 Horse)时,我将之前的训练器和马分配给该结果实例。
我应该在这里做什么才能将新的Result 添加到上下文中?
- 如果我附加训练器/马,那么当我附加结果时,我会收到
InvalidOperationException,告诉我训练器已经在对象上下文中。 - 如果我添加培训师而不是附加培训师,我会收到另一个错误(现在不记得了,但它告诉我培训师已经在数据库中)。
重要提示:
附加结果时出现第一个错误,执行SaveChanges()时出现第二个错误。
我在这里要避免的是每次添加新结果时都调用SaveChanges()。
【问题讨论】:
标签: c# entity-framework