Entity Framework 6 - Code First: схема таблицы из пространства имен классов

Кто-нибудь знает, можно ли установить схему таблиц первых классов кода на основе пространства имен классов?

Например, каждый класс в пространстве имен Core.Foo будет иметь схему Foo.

Ответ 1

Ну, вы можете указать имя схемы, используя одну из этих двух опций:

  • Использование Аннотации данных:

    [Table("TableName","Foo")]
    public class Entity
    {
    }
    
  • Использование Fluent Api:

    modelBuilder.Entity<Entity>().ToTable("TableName", "Foo");
    

Update

Копаясь больше в этом вопросе, я думаю, что вы ищете Пользовательскую конвенцию EF:

public class CustomSchemaConvention : Convention
{
    public CustomSchemaConvention()
    {
        Types().Configure(c => c.ToTable(c.ClrType.Name, c.ClrType.Namespace.Substring(c.ClrType.Namespace.LastIndexOf('.') + 1)));
    }
}

Затем в вашем контексте вам необходимо переопределить метод OnModelCreating, чтобы добавить новое соглашение:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions.Add(new CustomSchemaConvention());
}

Ответ 2

Я добавлю одну вещь к тому, что предоставил octavioccl. Если вы хотите сохранить плюрализацию имени таблицы, вы можете использовать встроенное сервис pluralization следующим образом:

using System.Data.Entity.Infrastructure.DependencyResolution;
public class CustomSchemaConvention : Convention
{
    public CustomSchemaConvention()
    {
        var pluralizationService = DbConfiguration.DependencyResolver.GetService<IPluralizationService>();
        Types().Configure(c => c.ToTable(
            pluralizationService.Pluralize(c.ClrType.Name),
            c.ClrType.Namespace.Substring(c.ClrType.Namespace.LastIndexOf('.') + 1))
        );
    }
}

Ответ 3

В EF 6.2 или EF Core используйте свойство Schema, чтобы указать имя схемы для таблицы Db, как показано ниже:

[Table("TableName", Schema = "Foo")]
public class Entity
{
    //Properties
}

Подробности здесь