EF4是否总是为新添加的实体使用临时密钥?

时间:2012-02-02 15:00:17

标签: .net entity-framework-4

我一直在尝试使用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为真,我如何通过主键找到新添加的实体?

1 个答案:

答案 0 :(得分:0)

MSDN声明如下:

  

通过调用,将新对象添加到ObjectContext中   ObjectContext或ObjectSet上的AddObject方法或添加对象   到关系“很多”端的对象集合。

     

此时,Entity Framework会生成一个临时密钥   用于在ObjectStateManager中存储对象。

仅在SaveChanges(和相应的Insert语句)之后创建了EntityKey。