我在使用Entity Framework和C#时遇到错误。
我试图用一行代码保存任何通用实体:
objectContextInstance.AddObject(objectToSave.GetType().ToString(), objectToSave)
我收到的错误消息是:
提供的EntitySet名称必须是 由EntityContainer名称限定, 如 'EntityContainerName.EntitySetName', 或DefaultContainerName属性 必须为ObjectContext设置。
我不明白这个错误,因为我检查了实体数据模型并验证了DefaultContainerName已经设置。
任何人都可以提供有关如何解决此问题的任何建议吗?
答案 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;
希望这有帮助。