Entity Framework 4: Code First - Создание БД в другой схеме?MapSingleType? - PullRequest
18 голосов
/ 30 января 2011

У меня есть база данных, и я использую 2 разные схемы. Схемы похожи на пространства имен (поправьте меня, если я ошибаюсь). Таким образом, у меня есть 1 дБ и в настоящее время 2 схемы ... поэтому таблицы в 1 схеме можно назвать такими же, как таблицы в другой схеме, поскольку они находятся в отдельных схемах.

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

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

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

Ответы [ 3 ]

10 голосов
/ 31 января 2011

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

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"));
}  

Есть пара замечаний Артура Виккерса здесь относительно наследования TPTи отношения многие ко многим.

7 голосов
/ 16 марта 2012

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

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

End Class

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

1 голос
/ 03 марта 2011

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

...