在ADO.Net Data Services中,如何检查实体是否已在上下文中?

时间:2008-10-23 04:57:43

标签: entity-framework wcf-data-services

我有一个ADO.Net数据服务,我用它来进行数据导入。大多数实体都链接了许多实体。要在导入期间执行此操作,我首先创建这些实体,保存它们然后使用.SetLink(EntityImport,“NavigationProperty”,CreatedEntity)。现在我遇到的第一个问题是上下文并不总是知道CreatedEntity(这是由于每个实体都是独立导入的,并且在创建每个项目时创建了一个上下文 - 我想保留这个功能 - 即我试图避免“只使用一个上下文”作为答案)。

所以我在尝试调用SetLink之前有一个.AddToCreatedEntityType(CreatedEntity)。这当然是第一次工作,但在第二次传递时,我收到错误消息“上下文已经跟踪实体”。

有没有办法检查上下文是否已经跟踪实体(context.Contains(CreatedEntity)尚未实现)?我正在考虑尝试捕获并只是避免错误,但这似乎每次传递都会创建一个新的CreatedEntity。看起来我需要使用LINQ to Data Services来每次获取CreatedEntity,但这看起来效率不高 - 有什么建议吗?

2 个答案:

答案 0 :(得分:5)

我认为您应该查看实体的EntityState属性。

仅当它的值为EntityState.Detached时才必须将其添加到您的上下文中。

不要忘记以下评论:

  

此枚举具有FlagsAttribute   允许按位的属性   其成员价值的组合。

我会创建一个扩展方法:

public static class EntityObjectExtensions
{
    public static Boolean IsTracked(this EntityObject self)
    {
        return (self.EntityState & EntityState.Detached) != EntityState.Detached;
    }
}

答案 1 :(得分:3)

当试图检查上下文是否跟踪我想要更新(或添加)的实体时,当我发现context.Entites.Contains(currentItem)不起作用时,我非常失望。

我用它来解决它:

if (context.Entities.Where(entities => entities.Entity == currentItem).Any())
{
   this.service.UpdateObject(currentItem);                    
}