在实体框架4.1中普遍定义数据库模式名称

时间:2011-07-21 05:53:16

标签: c# oracle entity-framework entity-framework-4.1 odac

我知道您可以使用ToTable("TableName", "SchemaName")为每个类定义实体的模式名称,但有没有办法设置它,以便您可以为配置中的所有表设置模式名称,因为我得到了一些奇怪的结果当我使用某些类型的关系映射和拆分实体映射时,它将恢复为内部SQL查询中的默认dbo.TableName

请参阅this earlier post获取sql输出示例

2 个答案:

答案 0 :(得分:3)

我首先使用带有EF 4.1的Oracle数据库,所有映射都使用数据注释完成。测试和生产环境中的不同模式名称。我的解决方案是在OnModelCreating期间动态映射Schema,并提供一些流畅的API,反射和后期绑定的帮助。迭代泛型类型的所有Context类属性并执行脏工作。到目前为止对我有用。

public class Context : DbContext
{
    public Context()
        : base(new OracleConnection(ConfigurationManager.ConnectionStrings["OraAspNetConString"].ConnectionString), true)
    {
    }

    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        foreach (var p in typeof(Context).GetProperties().Where(foo=>foo.PropertyType.IsGenericType))
        {
            // this is what we are trying to accomplish here -- 
            //modelBuilder.Entity<User>().ToTable("TBL_USERS", "TestSchema");

            Type tParam = p.PropertyType.GetGenericArguments()[0]; // typeof User
            MethodInfo generic = typeof(DbModelBuilder).GetMethod("Entity").MakeGenericMethod(new[] { tParam });
            object entityTypeConfig = generic.Invoke(modelBuilder, null);

            MethodInfo methodToTable = typeof(EntityTypeConfiguration<>).MakeGenericType(new[] { tParam }).GetMethod("ToTable", new Type[] { typeof(string), typeof(string) });
            methodToTable.Invoke(entityTypeConfig, new[] { GetMappedTableName(tParam), currentOraSchemaName });
        }

        base.OnModelCreating(modelBuilder);
    }

    private string currentOraSchemaName = ConfigurationManager.AppSettings.Get("OraSchemaName");

    private string GetMappedTableName(Type tParam)
    {
        TableAttribute tableAttribute = (TableAttribute)tParam.GetCustomAttributes(typeof(TableAttribute), false).FirstOrDefault();
        return tableAttribute.Name;
    }
}

这里的用户类,没有硬编码的模式映射 -

[Table("TBL_USERS")]
public class User
{
    [Column("USER_ID")]
    public string UserId { get; set; }

    [Column("USER_NAME")]
    public string Name { get; set; }} 

答案 1 :(得分:0)

由于最终的EFv4.1版本没有自定义约定的公共API,因此无法从API全局更改架构。