【问题标题】:How to get name of schema from entity framework?如何从实体框架中获取模式名称?
【发布时间】:2013-09-03 08:49:27
【问题描述】:

我有以下代码

using (WdmEntities context = new WdmEntities())
{
    //get object models from context
    ObjectContext objContext = ((IObjectContextAdapter)context).ObjectContext;
    var container = objContext.MetadataWorkspace.GetEntityContainer(objContext.DefaultContainerName, DataSpace.CSpace);
    List<string> schemas = new List<string>();
    foreach (var set in container.BaseEntitySets)
    {
        foreach (var metaproperty in set.MetadataProperties)
        {
            //here 
            if(metaproperty.Name == "Schema")
            {
                //but metaproperty.Value == NULL
                schemas.Add(metaproperty.Value);
            }
        }
    }
}

我得到空值而不是模式名称。我如何从实体框架中获取 shemas 的名称。 (在我的数据库中,我有两种不同的 shemas。)也许有人知道另一种方式?

【问题讨论】:

    标签: c# entity-framework datacontext objectcontext


    【解决方案1】:

    我的方法不对。下面的代码显示了我是如何获得方案名称的。

    using (WdmEntities context = new WdmEntities())
    {
        //get object models from context
        ObjectContext objContext = ((IObjectContextAdapter)context).ObjectContext;
        //get all full names types from object model
        var fullNameTypes = objContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace);
        ///////////////////
        var conStr = objContext.Connection.ConnectionString;
        var connection = new EntityConnection(conStr);
        var workspace = connection.GetMetadataWorkspace();
    
        var entitySets = workspace.GetItems<EntityContainer>(DataSpace.SSpace).First().BaseEntitySets;
    
        for (int i = 0; i < fullNameTypes.Count; i++)
        {
            Type type = Type.GetType(fullNameTypes[i].FullName);
            string schema = entitySets[type.Name].MetadataProperties["Schema"].Value.ToString();   
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个。它经过了很好的测试。如有任何疑问,请告诉我。

      using (var context = new WdmEntities())
                      {
                          //get object models from context
                          var objContext = ((IObjectContextAdapter)context).ObjectContext;
                          var items = objContext.MetadataWorkspace.GetItems<EntityContainer>(DataSpace.SSpace);
                          var container = items != null ? items.First() : null;
                          var schemas = new List<string>();
                          if(container != null)
                              schemas = container.BaseEntitySets.Select(set => set.Name).ToList();
                      }
      

      【讨论】:

      • 异常 — 空间 'SSpace' 没有关联的集合
      • @Mikhail,如果您的意思是“SSpace”不返回任何集合,那么我会返回一个集合,但始终只包含一个项目。这就是我在这里使用 First() 方法的原因。您可以将其称为 CodeFirst 方法实现或设计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 2013-10-16
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多