Как использовать Entity Framework 6.x в Asp.Net 5 (MVC 6)
Я тестирую новый Asp.Net 5, используя VS 2015 CTP-6. Из-за отсутствия функций в Entity Framework 7 я бы предпочел использовать EF6.
Я попытался удалить EF7, а затем применить EF6 в PM, например:
Uninstall-Package EntityFramework
Install-Package EntityFramework -version 6.1.3
Ошибок не возвращено, и файл project.json кажется соответствующим образом обновлен. Хотя нет доступных DbContext.
Возможно ли это? Если да, то как мне исходить отсюда? Нужен ли мне web.config для совместимости с EF6?
Ответы
Ответ 1
Да, это прекрасно работает.
Вам нужно вручную установить строку соединения при создании контекста, поскольку он не может получить его из web.config
чтобы вы могли сделать это
public class MyContext : DbContext {
public MyContext(string connectionString) : base(connectionString) {
}
}
var context = new MyContext("myConnectionString");
если вы хотите получить строку подключения из config.json, попробуйте это
IConfiguration configuration = new Configuration().AddJsonFile("config.json");
var connectionString = configuration["Data:DefaultConnection:ConnectionString"]);
и если вы хотите вставить контекст в контейнер DI, я добавил factory, как этот
public static class MyContextFactory
{
public static MyContext GetContext() {
IConfiguration configuration = new Configuration().AddJsonFile("config.json");
return new MyContext(configuration["Data:DefaultConnection:ConnectionString"]);
}
}
а затем добавил это в startup.cs
services.AddTransient<MyContext>((a) => MyContextFactory.GetContext());
Ответ 2
В зависимости от используемой базы данных это может быть не так просто, как ответить. Если вы используете MsSql, настройка не требуется, и принятый ответ будет прекрасен. Но при использовании LocalDB
может потребоваться некоторая конфигурация.
Например, MySql
необходимо зарегистрировать поставщика
[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration
public class ApplicationDbContext : DbContext
{
[...]
}
public class CodeConfig : DbConfiguration
{
public CodeConfig()
{
SetDefaultConnectionFactory(new MySql.Data.Entity.MySqlConnectionFactory());
SetProviderServices("MySql.Data.MySqlClient",
new MySql.Data.MySqlClient.MySqlProviderServices());
}
}
PostgreSql
необходимо зарегистрировать поставщика в разделе entityFramework AND system.data. Это можно сделать, используя событие System.Data.Entity.DbConfiguration.Loaded
. То же самое происходит с Oracle
.
Отметьте это сообщение в блоге, которое подробно объяснит его: http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/
Ответ 3
Можете ли вы не просто сделать это в файле startup.cs? Сохраните создание factory
// new context on each request
services.AddScoped<IMyContext, MyContext>((s) =>
{
return new MyContext(Configuration["Data:MyConnection:ConnectionString"]);
});
Ответ 4
В версии RC это будет:
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();
var Configuration = builder.Build();
var connectionString = Configuration["Data:DefaultConnection:ConnectionString"];
Ответ 5
Прежде чем начать, убедитесь, что вы компилируете полную платформу .NET Framework в project.json
, поскольку Entity Framework 6 не поддерживает .NET Core. Если вам нужны кросс-платформенные функции, вам нужно будет перейти на платформу Entity Framework Core.
В файле project.json укажите одну цель для полной .NET Framework:
"frameworks": {
"net46": {}
}
а затем установочные строки подключения и инъекции зависимостей
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
}
В классе Startup в ConfigureServices добавьте метод factory вашего контекста со своей строкой соединения. Контекст должен быть разрешен один раз для каждой области для обеспечения производительности и обеспечения надежной работы Entity Framework.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"]));
// Configure remaining services
}
ntity Framework 6 позволяет настроить конфигурацию в xml (в web.config или app.config) или через код. Начиная с ASP.NET Core, вся конфигурация основана на коде.
Конфигурация на основе кода достигается путем создания подкласса System.Data.Entity.Config.DbConfiguration
и применения System.Data.Entity.DbConfigurationTypeAttribute
к вашему подклассу DbContext.
Наш конфигурационный файл обычно выглядит так:
<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>
Элемент defaultConnectionFactory устанавливает factory для соединений. Если этот атрибут не установлен, значением по умолчанию является SqlConnectionProvider. Если, с другой стороны, значение предоставляется, данный класс будет использоваться для создания DbConnection с помощью метода CreateConnection. Если данный factory не имеет конструктора по умолчанию, вы должны добавить параметры, которые используются для построения объекта
[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);
}
}
В этой статье будет показано, как использовать Entity Framework 6 внутри основного приложения ASP.NET.
https://docs.asp.net/en/latest/data/entity-framework-6.html