从DbEntityEntry获取表名(代码优先)

时间:2011-07-06 17:06:54

标签: c# entity-framework ef-code-first

简单:如何从DbEntityEntry对象获取映射表名?我在一个扩展DbContext的类中。我见过ObjectContext的例子,但不适用于CF。

感谢。

4 个答案:

答案 0 :(得分:9)

如另一个答案所述,可以使用IObjectContextAdapter

获取表名
 private string GetTableName(DbEntityEntry ent)
        {
            ObjectContext objectContext = ((IObjectContextAdapter) this).ObjectContext;
            Type entityType = ent.Entity.GetType();

            if (entityType.BaseType != null && entityType.Namespace == "System.Data.Entity.DynamicProxies")
                entityType = entityType.BaseType;

            string entityTypeName = entityType.Name;

            EntityContainer container =
                objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace);
            string entitySetName = (from meta in container.BaseEntitySets
                                    where meta.ElementType.Name == entityTypeName
                                    select meta.Name).First();
            return entitySetName;
        }

上面的代码也测试了代理。希望这可以帮助其他人来到这个链接,因为我认为原始海报很久以前解决了这个问题。

答案 1 :(得分:6)

我在msdn找到了一种更清晰的方法来摆脱代理名称。

private string GetTableName(DbEntityEntry ent)
{
     return ObjectContext.GetObjectType(entry.Entity.GetType()).Name;
}

答案 2 :(得分:0)

实际上,您可以从ObjectContext获取DbContext(通过将其转换为IObjectContextAdapter)并使用您看过的示例。

答案 3 :(得分:0)

msdn上,您可以找到DbContext的文档,在那里您可以看到它显式实现了IObjectContextAdapter,因此将DbContext派生的Context转换为IObjectContextAdapter并使用ObjectContext属性。