1

В моем веб-проекте я пытаюсь использовать первый подход модели Entity Framework 6. Модель создается из существующей базы данных в отдельном проекте. Для построения модели строка подключения сохраняется в app.config проекта доступа к данным. В основном веб-проекте (ASP.NET Core MVC) Я пытаюсь создать контекстное создание в классе Startup.cs.Модель создания первого DbContext в Entity Framework 6

Ниже приведен код для частичного класса контекста. Частичный класс используется, потому что контекст автоматически генерируется из шаблона.

[DbConfigurationType(typeof(EntityFrameworkConfig))] 
public partial class MyEntities 
{ 
    public MyEntities(String name) : base(name) 
    {  
    } 
} 

Для использования конфигурации рамочного объекта из кода вместо app.config, которые не может быть использован с ASP.NET основных проектами я класс конфигурации, унаследованными от System.Data.Entity.DbConfiguration

public class EntityFrameworkConfig : DbConfiguration 
{ 
    public EntityFrameworkConfig() 
    { 
     this.SetDefaultConnectionFactory(new SqlConnectionFactory()); 
     this.SetProviderServices(SqlProviderServices.ProviderInvariantName,  SqlProviderServices.Instance); 
    } 
} 

В конфигурации .json в веб-проекте у меня есть строка соединения:

{ 
    "MailSettings": { 
    "ToAddress": "[email protected]" 
    }, 
    "Connection": { 
    "ConnectionString": "data source=SERVER;initial catalog=DB;user id=user;password=pwd;MultipleActiveResultSets=True;App=EntityFramework;" 
    } 
} 

в Startup.cs:

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    String connStr = _config["Connection:ConnectionString"]; 
    services.AddScoped((_) => new MyEntities(connStr)); 
    ... 

}

Я испытываю UnintentionalCodeFirstException выброшен из OnModelCreating случае автогенерируемая контекста класса:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

Является ли это правильный способ использовать Entity рамки 6 модели первый подход с проектом asp.net MVC ядра и в чем причина этого исключения?

ответ

0

После копания я обнаружил, что решение предоставить строку подключения в Entity Framework формате, который позволяет класс DbContext для загрузки модели метаданных ,
В Startup.cs:

String connStr = _config["Connection:ConnectionString"]; 
String efConnString = BuildConnectionString(connStr); 
services.AddScoped((_) => new MyEntities(efConnString)); 
.... 
.... 
private String BuildConnectionString(String cs) 
{ 
    EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); 
    entityBuilder.Provider = "System.Data.SqlClient"; 
    entityBuilder.ProviderConnectionString = cs; 
    entityBuilder.Metadata = @"res://*/XXXWebModel.csdl| 
         res://*/XXXWebModel.ssdl| 
         res://*/XXXWebModel.msl"; 
    return entityBuilder.ToString(); 
} 

Когда строка подключения предоставляются в формате, который не содержит информации о метаданных, где искать генерируемые рамки модели объекта находит, что код первого подход используется, и именно поэтому метод OnModelCreating является называется, что бросает исключение:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

Передача строки соединения отформатированный в рамочном объект строки подключения, которая содержит метаданных решает проблему.

2

Это шаги, которым вы должны следовать, когда работаете с ASP.net Core и EF 6. Это просто пример. Вы должны изменить его в соответствии с вашим вариантом использования.

Шаг 1:project.json

Укажите одну цель для полной версии .NET Framework:

"frameworks": { 
    "net46": {} 
} 

Шаг 2: строки подключения Настройка и внедрение зависимостей

public class ApplicationDbContext : DbContext 
{ 
    public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 
} 

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"])); 

    // Configure remaining services 
} 

Шаг 3: конфигурации мигрирует из конфигурации с кодом

Entity Framework, 6 позволяет конфигурации должны быть определены в XML (в web.config или app.config) или через код. Что касается ASP.NET Core, вся конфигурация основана на коде.

<entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
      <parameter value="mssqllocaldb" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
</entityFramework> 

Тогда:

[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration 
public class ApplicationDbContext : DbContext 
{ 
    [...] 
} 

public class CodeConfig : DbConfiguration 
{ 
    public CodeConfig() 
    { 
     SetProviderServices("System.Data.SqlClient", 
      System.Data.Entity.SqlServer.SqlProviderServices.Instance); 
    } 
} 

Ссылка:ASP.NET Core and Entity Framework 6

+0

Я сделал то же самое, но всегда получал это исключение. Единственное отличие состоит в том, что я использовал частичный класс для расширения автоматически созданного контекстного класса с помощью нового конструктора, чтобы включить передачу строки подключения в качестве аргумента, а в моем проекте.json У меня есть net462 в качестве фреймворка. – srlle

+0

Вы правильно определили '' '' правильно? вы можете это показать? – Sampath

+0

<параметр значение = "mssqllocaldb" /> <поставщик invariantName =» System.Data.SqlClient "type =" System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer "/> Это то, что у меня есть в web.config, и я думаю, что это то же самое как вы предложили. – srlle

Смежные вопросы