我一直在尝试使用TryGetObjectByKey在上下文中查找新添加的实体:
Dim ObjectFound As Boolean = Context.TryGetObjectByKey(entityKey, obj)
我发现TryGetObjectByKey总是失败,即使我知道我正在寻找的实体已被添加到上下文中。有问题的实体使用电子邮件地址作为主键,并且该电子邮件地址是通过实体的构造函数提供的(它不是由DB生成的):
Public Class Customer
Private _email as string
Public Sub New (Email as string)
'Email is the primary key in the DB and the entity key in EF4.
'It is not generated by the DB.
_email = Email
End Sub
End Class
经过进一步调查后,我发现所有添加的实体的EntityKeys都没有值,并且它们的IsTemporary标志设置为true。 TryGetObjectByKey失败,因为尚未设置添加对象的EntityKey。
我最初的印象是,如果DB不生成EntityKey,则在调用AddObject时会立即生成EntityKey。所以,有两个问题:
1)我是否应该期望所有新添加的实体都拥有临时的EntityKeys?
2)如果#1为真,我如何通过主键找到新添加的实体?
答案 0 :(得分:0)
MSDN声明如下:
通过调用,将新对象添加到ObjectContext中 ObjectContext或ObjectSet上的AddObject方法或添加对象 到关系“很多”端的对象集合。
此时,Entity Framework会生成一个临时密钥 用于在ObjectStateManager中存储对象。
仅在SaveChanges(和相应的Insert语句)之后创建了EntityKey。