从DbEntityEntry (Code-First)中获取表名

本文关键字:获取 DbEntityEntry Code-First | 更新日期: 2023-09-27 18:01:27

简单:如何从DbEntityEntry对象获得映射的表名?我在一个扩展DbContext的类中。我已经看到了ObjectContext的例子,但并不适用于CF。

谢谢。

从DbEntityEntry (Code-First)中获取表名

如另一个答案所述,可以使用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;
        }

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

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

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

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

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