如何使用Code First(实体框架)和DbContext获取实体的模式名称?

时间:2012-02-24 16:08:36

标签: entity-framework schema code-first dbcontext

我们的数据库是以这样的方式设计的,其中有各种用于生产的模式和用于测试的各种等效模式。例如,许多表位于MyProduction架构中,而相同的表位于MyTest架构中。

我想要做的是确定一个表正在使用哪个模式,所以我知道要将哪个模式更改为。因此,默认情况下,所有内容都将位于生产模式下。在DbContext的OnModelCreating事件中,如果我需要指向test(由某些true / false配置确定),我需要确定正在使用的生产模式,然后将其指向它的测试等效项。

我已经知道如何设置架构但无法找到如何获取它。任何想法我如何确定表正在使用的架构?

谢谢。

3 个答案:

答案 0 :(得分:0)

根据您的本地设置修改后尝试以下代码:

var context = new YouDbContext("ConnectionName");
var adapter = (IObjectContextAdapter)context;
var objectContext = adapter.ObjectContext;
EntitySetBase schema = null;
if (objectContext.MetadataWorkspace != null)
{
    schema = objectContext.MetadataWorkspace
        .GetItems<EntityContainer>(DataSpace.SSpace).First()
        .BaseEntitySets
        .First(meta => meta.ElementType.Name == "ClassNameUnderYourDbContext");
}
//See the properties of schema in debug mode to understand details

答案 1 :(得分:-1)

实体框架模式是System.ComponentModel.DataAnnotations.TableAttribute对象。以下是一些可用于获取权限的架构名称和表名称的方法。干杯!

    private string GetTableName(Type type)
    {
        var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault();
        if (tableAttribute != null && !string.IsNullOrEmpty(tableAttribute.Name))
        {
            return tableAttribute.Name;
        }
        else
        {
            return string.Empty;
        }
    }

    private string GetTableSchema(Type type)
    {
        var tableAttribute = type.GetCustomAttributes(false).OfType<System.ComponentModel.DataAnnotations.TableAttribute>().FirstOrDefault();
        if (tableAttribute != null && !string.IsNullOrEmpty(tableAttribute.Schema))
        {
            return tableAttribute.Schema;
        }
        else
        {
            return string.Empty;
        }
    }

答案 2 :(得分:-1)

System.ComponentModel.DataAnnotations.Schema.TableAttribute