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

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

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

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

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

Ответы [ 5 ]

129 голосов
/ 27 февраля 2014

Для тех, кто использует Entity Framework 6, просто используйте метод HasDefaultSchema:

public class Contexto : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
    }
}
32 голосов
/ 05 марта 2012

Вы можете использовать метод ToTable, чтобы указать имя схемы. Если вы не укажете имя схемы, EF по соглашению будет использовать dbo.

public class MyContext
{
    private string schemaName = "Foo";

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
    } 
}
7 голосов
/ 08 ноября 2013

Для первых реализаций базы данных это просто.Откройте файл edmx, щелкните правой кнопкой мыши -> Свойства и установите схему базы данных по умолчанию.

Для кода в первую очередь эта статья кажется наиболее перспективной.http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design

4 голосов
/ 03 октября 2017

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

Обратите внимание на следующее: enter image description here

хорошая справка для изучения: http://www.c -sharpcorner.com / article / fluent-api-в-коде-первых, подход /

4 голосов
/ 30 декабря 2014

Я хотел бы добавить, так как это для C #, я написал один ниже для 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
...