2011-01-30 3 views
18

У меня есть база данных, и я использую 2 разных схемы. Схемы подобны пространствам имен (исправьте меня, если я ошибаюсь). Таким образом, у меня есть 1 дБ и в настоящее время 2 схемы ... поэтому таблицы в 1 схеме могут быть названы так же, как и таблицы в другой схеме, потому что они находятся в отдельных схемах.Entity Framework 4: Code First - создание db в другой схеме? MapSingleType?

Как мне получить код EF, чтобы сначала поговорить с другой схемой, а не по умолчанию?

Возможно ли, что это связано с MapSingleType и переопределением метода, или я могу сделать что-то еще?

Любая помощь действительно оценена.

ответ

10

Вы можете осуществить следующее соглашение:

public class DefaultSchemaConvention : 
      IConfigurationConvention<Type, EntityTypeConfiguration> 
{ 
    string defaultSchema; 
    public DefaultSchemaConvention(string defaultSchema) 
    { 
     if (String.IsNullOrWhiteSpace(defaultSchema)) 
      throw new ArgumentException("defaultSchema"); 
     this.defaultSchema = defaultSchema; 
    } 

    void IConfigurationConvention<Type, EntityTypeConfiguration>.Apply(
     Type memberInfo, Func<EntityTypeConfiguration> configuration) 
    { 
     EntityTypeConfiguration cfg = configuration(); 
     string tableName = cfg.EntitySetName; 
     if (String.IsNullOrEmpty(tableName)) 
      tableName = memberInfo.Name; 
     cfg.ToTable(tableName, this.defaultSchema); 
    } 
} 

Использование:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 
    modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.Edm.Db.ColumnTypeCasingConvention>(); 
    modelBuilder.Conventions.Add(new DefaultSchemaConvention("TEST")); 
} 

Существует несколько боковых нот Артур Vickers here в отношении наследования ТРТ и многие-ко-многим отношений.

+1

Спасибо за помощь. – Martin

+4

К сожалению, это больше не работает, выглядит как EF 4.1, удаленный 'IConfigurationConvention'. – Omar

+0

Теперь вы можете переопределить OnModelCreating в своем DbContext и сопоставить сущность с таблицей с помощью modelBuilder.Entity (). ToTable («MyTableName», «MySchemaName»); – hnafar

1

Вот пример того, как использовать схемы таблиц сущностей, основанные на пространствах имен ваших моделей. Например, если у вас есть модель RiaLib.Data.Models.Membership.User, тогда соответствующая таблица db будет называться [Членство]. [Пользователь] вместо [dbo]. [Пользователь].

public class DatabaseContext : DbContext 
{ 
    public DbSet<Membership.User> Users { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Add(new TableSchemaConvention()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

https://github.com/rialib/efextensions>TableSchemaConvention.cs

7

Я не знаю о модели CodeFirst, но DataAnnotation для "Таблица" включает в себя вариант схемы. Мой код выглядит как это:

<Table("Product", Schema:="SalesLT")> 
Public Class Product 

End Class 

Это помогло мне справиться с альтернативными схемами

+0

Нет, похоже, больше нет. Хотелось бы. – Kahanu

+0

Спасибо! Работает для EF 5.0. –

 Смежные вопросы

  • Нет связанных вопросов^_^