2009-07-23 45 views
1

我在使用实体框架和C#时出现错误。使用ObjectContext.AddObject与实体框架时出现错误

我想保存任何通用实体类似一行代码如下:

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

我收到的错误消息是:

所提供的EntitySet的名称必须是 合格由EntityContainer名称 (如 )必须为ObjectContext设置'EntityContainerName.EntitySetName', 或DefaultContainerName属性 。

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

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

回答

4

试试这个:

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

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

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

当然,这会有点慢 - 但如果您的数据库不是插入数据库,没关系。

+0

工作,谢谢!我不明白的是,我之前在WPF应用程序中使用过我的策略,并通过了我的单元测试。但是,现在我使用它与ASP.NET MVC,它不起作用。无论如何,感谢您的解决方案。 – YeahStu 2009-07-23 22:53:48

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; 
    } 

客户端代码是这样的:

串entitySetName = Context.GetEntitySet(user.GetType())名称;

希望这会有所帮助。