2012-02-02 42 views
0

我一直在尝试使用TryGetObjectByKey找到依据上下文新增实体:EF4是否总是使用临时密钥来添加新实体?

Dim ObjectFound As Boolean = Context.TryGetObjectByKey(entityKey, obj) 

我发现TryGetObjectByKey总是失败,即使我知道,实体我一直在寻找已被添加到上下文。有问题的实体使用的电子邮件地址作为主键,并通过构造函数的实体(它不是由DB生成的)提供的email地址:

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尚未设置。

我最初的印象是EntityKey会在调用AddObject时立即生成,如果EntityKey不是由DB生成的。所以,有两个问题:

1)我应该期望所有新添加的实体都有临时的EntityKeys吗?

2)如果#1为真,我如何通过主键找到新增的实体?

回答

0

MSDN状态以下:

新对象添加到ObjectContext的通过调用上的ObjectContext或对象集的 AddObject方法或通过在“多”添加对象 到对象的集合关系的结束。

此时,实体框架会生成一个临时密钥,其中 用于将对象存储在ObjectStateManager中。

只有在SaveChanges(和相应的Insert语句)之后创建了一个EntityKey。

相关问题