определить имя схемы базы данных универсально в рамках сущности 4.1 - PullRequest
1 голос
/ 21 июля 2011

я знаю, что вы можете определить имя схемы сущности для класса с помощью ToTable("TableName", "SchemaName"), но есть ли способ настроить его, чтобы вы могли установить имя схемы для всех таблиц в конфигурации, поскольку я получаю некоторые странные результаты, когда яЯ использую некоторые типы сопоставления отношений и разделенного отображения сущностей, когда он возвращается к значению по умолчанию dbo.TableName во внутренних запросах sql

см. в этом предыдущем посте для примера вывода sql

Ответы [ 2 ]

3 голосов
/ 18 января 2012

У меня сначала база данных Oracle с EF 4.1, все сопоставления сделаны с аннотациями данных.Различные имена схем в средах тестирования и производства.Мое решение состоит в том, чтобы отобразить схему динамически во время OnModelCreating с помощью плавного 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; }} 
0 голосов
/ 21 июля 2011

Поскольку окончательная версия EFv4.1 не имеет общедоступного API для пользовательских соглашений, вы не можете изменить схему глобально из API.

...