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

Как использовать 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?

4b9b3361

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