Подтвердить что ты не робот

Могу ли я изменить имя схемы по умолчанию во фреймворке сущностей 4.3 с кодом?

В настоящее время я развертываю свое приложение в общедоступной среде хостинга, а сначала код с миграциями работает отлично, за исключением одного незначительного икота. Каждый раз, когда я хочу нажать на сайт, я должен использовать параметр "Обновить базу данных - script", потому что мне нужно добавить каждое имя таблицы с помощью [dbo], потому что по умолчанию общий хост создает имя схемы по умолчанию с тем же именем как имя пользователя базы данных.

Если я запишусь на свой общий хост и создаю базу данных, я должен создать пользователя. Если я назову этот администратор пользователя, тогда сначала создаются таблицы, а во время входа в систему, поскольку администратор выглядит примерно так: "[admin]. [BlogPosts]". Когда приложение запускается, все таблицы создаются, но я получаю исключение EF, потому что он говорит: "[dbo]. [BlogPosts]" недействителен. Если я переименую имя схемы таблицы в "[dbo]" вместо "[admin]", который ее исправляет.

Чтобы обойти это, мне нужно сгенерировать миграции script, которые будут выполняться вручную, и добавить "[dbo]" перед всеми именами таблиц, потому что script ссылается только на таблицы по их имени, а не по их именам схемы и их имени.

Есть ли простой способ обойти это? Было бы так приятно, если бы все, что мне нужно было сделать, это опубликовать приложение, и все просто сработало. Если бы не расхождение в имени схемы, это было бы одним щелчком мыши, и все было бы великолепно.

4b9b3361

Ответ 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/