Могу ли я изменить имя схемы по умолчанию во фреймворке сущностей 4.3 с кодом?
В настоящее время я развертываю свое приложение в общедоступной среде хостинга, а сначала код с миграциями работает отлично, за исключением одного незначительного икота. Каждый раз, когда я хочу нажать на сайт, я должен использовать параметр "Обновить базу данных - script", потому что мне нужно добавить каждое имя таблицы с помощью [dbo]
, потому что по умолчанию общий хост создает имя схемы по умолчанию с тем же именем как имя пользователя базы данных.
Если я запишусь на свой общий хост и создаю базу данных, я должен создать пользователя. Если я назову этот администратор пользователя, тогда сначала создаются таблицы, а во время входа в систему, поскольку администратор выглядит примерно так: "[admin]. [BlogPosts]". Когда приложение запускается, все таблицы создаются, но я получаю исключение EF, потому что он говорит: "[dbo]. [BlogPosts]" недействителен. Если я переименую имя схемы таблицы в "[dbo]" вместо "[admin]", который ее исправляет.
Чтобы обойти это, мне нужно сгенерировать миграции script, которые будут выполняться вручную, и добавить "[dbo]" перед всеми именами таблиц, потому что script ссылается только на таблицы по их имени, а не по их именам схемы и их имени.
Есть ли простой способ обойти это? Было бы так приятно, если бы все, что мне нужно было сделать, это опубликовать приложение, и все просто сработало. Если бы не расхождение в имени схемы, это было бы одним щелчком мыши, и все было бы великолепно.
Ответы
Ответ 1
Вы можете использовать метод ToTable
, чтобы указать имя схемы. Если вы не укажете имя схемы, EF по умолчанию будет использовать dbo
.
public class MyContext
{
private string schemaName = "Foo";
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
}
}
Ответ 2
Для тех, кто использует Entity Framework 6, просто используйте метод HasDefaultSchema
:
public class Contexto : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
}
}
Ответ 3
Для первых реализаций базы данных ее легко. Откройте файл edmx, щелкните правой кнопкой мыши- > Свойства и установите схему базы данных по умолчанию.
Для первого кода эта статья представляется наиболее перспективной.
http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design
Ответ 4
Я хотел бы добавить, так как это для С#, я написал один для VB
Public Class ClientDbContext
Inherits DbContext
Public Property Clients As DbSet(Of Client)
Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
modelBuilder.HasDefaultSchema("dbo")
End Sub
End Class
Ответ 5
В EF Code сначала, по умолчанию все настроено на основе доступа пользователя с административным доступом " DBO-Schema" на SQL Server. Но если определенный пользователь определен для работы с базой данных, которая является общей для общего хостинга, тогда больше не будет доступа к управлению Dbo. На этот раз имена наших таблиц - dbo.tableName, например, someUser.tableName, а неточность этой точки делает невозможным запуск программы. Чтобы изменить и явно назначить пользователя, подключенного к базе данных. Если вы используете метаданные, следует использовать следующий метод:
[Table("MyTableName", Schema="MySchemaName")]
public class MyClassName
{
//Other Lines...
}
Или (независимо от того, доступен ли Fluent API) следующим образом:)
modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");
Обратите внимание на следующее:
![введите описание изображения здесь]()
хорошая рекомендация для изучения:
http://www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/