我有一个ADO.Net数据服务,我用它来进行数据导入。大多数实体都链接了许多实体。要在导入期间执行此操作,我首先创建这些实体,保存它们然后使用.SetLink(EntityImport,“NavigationProperty”,CreatedEntity)。现在我遇到的第一个问题是上下文并不总是知道CreatedEntity(这是由于每个实体都是独立导入的,并且在创建每个项目时创建了一个上下文 - 我想保留这个功能 - 即我试图避免“只使用一个上下文”作为答案)。
所以我在尝试调用SetLink之前有一个.AddToCreatedEntityType(CreatedEntity)。这当然是第一次工作,但在第二次传递时,我收到错误消息“上下文已经跟踪实体”。
有没有办法检查上下文是否已经跟踪实体(context.Contains(CreatedEntity)尚未实现)?我正在考虑尝试捕获并只是避免错误,但这似乎每次传递都会创建一个新的CreatedEntity。看起来我需要使用LINQ to Data Services来每次获取CreatedEntity,但这看起来效率不高 - 有什么建议吗?
答案 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);
}