将ObjectContext.AddObject与Entity Framework一起使用时出错

时间:2009-07-23 20:44:52

标签: .net entity-framework

我在使用Entity Framework和C#时遇到错误。

我试图用一行代码保存任何通用实体:

objectContextInstance.AddObject(objectToSave.GetType().ToString(), objectToSave)

我收到的错误消息是:

  

提供的EntitySet名称必须是   由EntityContainer名称限定,   如   'EntityContainerName.EntitySetName',   或DefaultContainerName属性   必须为ObjectContext设置。

我不明白这个错误,因为我检查了实体数据模型并验证了DefaultContainerName已经设置。

任何人都可以提供有关如何解决此问题的任何建议吗?

3 个答案:

答案 0 :(得分:4)

试试这个:

objectContextInstance.AddObject(objectToSave.GetType().Name, objectToSave)

Type.ToString()返回名称空间限定名称,该名称可能也不是EntitySet的名称。

当然,这只有在实体类型名称和EntitySet名称相同时才有效。如果您无法保证这一点,则可以使用反射来检查对象上下文的公共方法,以获取以AddTo开头并且采用与objectToSave相同类型的单个参数的签名。 (这些方法由EDMX代码生成器生成,并将实体类型与实体集匹配。)

当然,这会有点慢 - 但如果你的数据库不是一个插入式数据库,那可能无关紧要。

答案 1 :(得分:2)

要么等待.NET 4.0,要么在此期间使用this workaround

答案 2 :(得分:0)

我找到了一个扩展方法,它获取了指定实体的EntitySetBase。这是我用来派生我的EntitySetBase。我正在使用自我跟踪实体。所以我把这个函数放在扩展部分的.tt文件中:

  public static EntitySetBase GetEntitySet(this ObjectContext context, Type entityType)
  {
   if (context == null)
   {
    throw new ArgumentNullException("context");
   }

   if (entityType == null)
   {
    throw new ArgumentNullException("entityType");
   }

   EntityContainer container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);

   if (container == null)
   {
    return null;
   }

   EntitySetBase entitySet = container.BaseEntitySets.Where(item => item.ElementType.Name.Equals(entityType.Name))
                .FirstOrDefault();

   return entitySet;
  }

客户端代码如下:

string entitySetName = Context.GetEntitySet(user.GetType())。Name;

希望这有帮助。