Entity Framework 4: Code First - создание db в другой схеме? MapSingleType?
У меня есть база данных, и я использую две разные схемы. Схемы подобны пространствам имен (исправьте меня, если я ошибаюсь). Таким образом, у меня есть 1 дБ и в настоящее время 2 схемы... поэтому таблицы в 1 схеме могут быть названы так же, как и таблицы в другой схеме, потому что они находятся в отдельных схемах.
Как мне сначала получить код EF для разговора с другой схемой, а не по умолчанию?
Возможно, что-то похожее на MapSingleType и переопределение метода, или я могу сделать что-то еще?
Любая помощь действительно ценится.
Ответы
Ответ 1
Вы можете реализовать следующее соглашение:
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 и отношений "многие ко многим" .
Ответ 2
Я не знаю о модели CodeFirst, но DataAnnotation для "Table" содержит параметр схемы. Мой код читается следующим образом:
<Table("Product", Schema:="SalesLT")>
Public Class Product
End Class
Это помогло мне разобраться с альтернативными схемами
Ответ 3
Вот пример того, как сделать сущностную структуру использовать схемы таблиц на основе пространств имен ваших моделей. Например, если у вас есть модель RiaLib.Data.Models.Membership.User
, тогда соответствующая таблица db будет называться [Membership]. [Пользователь] вместо [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