2013-01-10 146 views
0

为了更好地说明我的观点,我简化了代码。我需要有一些业务逻辑,我测试一个属性是否已经从a更改为b。我面临的问题是我正在操作的实体附加到我的DBContext。如果我在我引用的一个更新属性的另还更新:实体框架在内存实体中与保存的实体进行比较

.... 
    var oldEntity = context.Find(x); 
    var updatedEntity = context.Find(x); 

    //here updatedEntity.IntProperty is 6 

    updatedEntity.IntProperty = 7; 

    //here both oldEntity.IntProperty and updatedEntity.IntProperty 
    //are now 7 so my test isn't hit 
    if(oldEntity.IntProperty != updatedEntity.IntProperty && 
     updatedEntity.IntProperty == 7) 
    { 
     .... 

有一些简便的方法做我想做的,同时使连接到的DbContext这个实体的比较?

+0

您可能想看看ObjectStateManager。它缓存加载的属性。请参阅http://msdn.microsoft.com/en-us/library/system.data.objects.objectstatemanager.aspx – Andez

+0

我正在使用DBContext而不是ObjectContext。有没有办法从DBContext访问ObjectStateManager? –

+0

@BenTidman将您的DbContext转换为具有基础ObjectContext的IObjectContextAdapter,然后使用其属性ObjectStateManager。 –

回答

1

我正在使用nHydrate的实体框架。校长将是相同的(这是VB.NET对不起!):

Dim initialEntity = _context.ObjectStateManager.GetObjectStateEntry((TryCast(oldEntity, Objects.DataClasses.IEntityWithKey)).EntityKey) 

Dim oldValue As Integer = initialEntity.OriginalValues.GetValue("IntProperty") 
Dim newValue As Integer = initialEntity.CurrentValues.GetValue("IntProperty") 

希望这会有所帮助。

Andez

+0

是否可以查看特定属性?你能提供一个如何做到这一点的例子吗? –

+0

我已更新示例 - 您可以通过名称本质上调用。 – Andez