2015-03-27 13 views
25

Testuję nowy Asp.Net 5, używając VS 2015 CTP-6. Z powodu braku funkcji w Entity Framework 7, wolałbym teraz używać EF6.Jak korzystać z Entity Framework 6.x w Asp.Net 5 (MVC 6)

Próbowałem usunięcie EF7 a następnie zastosowanie EF6 w PM, tak:

Uninstall-Package EntityFramework 
Install-Package EntityFramework -version 6.1.3 

Brak błędów zwracane, a plik project.json wydaje odpowiednio zaktualizowane. Chociaż nie ma dostępnego DbContext.

Czy to w ogóle możliwe? Jeśli tak, w jaki sposób powinienem przejść dalej? Czy potrzebuję web.config do kompatybilności z EF6?

Odpowiedz

17

Tak, to działa dobrze.

trzeba ręcznie ustawić ciąg połączenia podczas tworzenia kontekstu, ponieważ nie można dostać go z web.config

więc można to zrobić

public class MyContext : DbContext { 
    public MyContext(string connectionString) : base(connectionString) { 
    } 
} 

var context = new MyContext("myConnectionString"); 

jeśli chcesz uzyskać ciąg połączenia z config.json, a następnie spróbuj tego

IConfiguration configuration = new Configuration().AddJsonFile("config.json"); 
var connectionString = configuration["Data:DefaultConnection:ConnectionString"]); 

a jeśli chcesz, aby wprowadzić kontekst do kontenera DI, a następnie dodałam fabrykę jak ten

public static class MyContextFactory 
{ 
    public static MyContext GetContext() { 
     IConfiguration configuration = new Configuration().AddJsonFile("config.json"); 
     return new MyContext(configuration["Data:DefaultConnection:ConnectionString"]); 
    } 

} 

a następnie dodaje to w startup.cs

services.AddTransient<MyContext>((a) => MyContextFactory.GetContext()); 
+0

Czy do projektu musimy jeszcze dołączyć System.Data? Czy to też przejdzie w zależności? – Yashvit

+0

nie trzeba ustawiać zależności, ale ponieważ EF 6 nie jest obsługiwany przez rdzeń .net, musisz upewnić się, że twój framework odwołuje się do "dnx451" zamiast "dotnet" w pliku project.son. –

+0

Jak odpowiedział Kenstone, ConfigurationBuilder powinien być użyty w RC zamiast konfiguracji. http://stackoverflow.com/a/33834167/3805983 –

5

Czy nie można po prostu zrobić w startup.cs plik? Zapisz tworzenie fabryki

// new context on each request 
services.AddScoped<IMyContext, MyContext>((s) => 
{ 
    return new MyContext(Configuration["Data:MyConnection:ConnectionString"]); 
}); 
+1

lub nawet w 1 linii: services.AddScoped (s => new MyContext (Configuration ["Data: MyConnection :Ciąg połączenia"])); – rfcdejong

6

W zależności od używanej bazy danych może nie być tak proste, jak udzielono odpowiedzi. Jeśli używasz MsSql, wtedy żadna konfiguracja nie jest potrzebna, a zaakceptowana odpowiedź jest całkowicie w porządku. Ale użycie LocalDB może wymagać pewnej konfiguracji.

Na przykład MySql musi zarejestrować Dostawcę

[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 musi zarejestrować dostawcę do entityFramework i sekcja System.Data. Można to zrobić, używając zdarzenia System.Data.Entity.DbConfiguration.Loaded. To samo dotyczy Oracle.

Sprawdź ten wpis na blogu, że wyjaśnia to w szczegółach: http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/

+2

Miałem * "Nie można określić nazwy dostawcy dla fabryki dostawcy typu" MySql.Data.MySqlClient.MySqlClientFactory ". Upewnij się, że dostawca ADO.NET jest zainstalowany lub zarejestrowany w konfiguracji aplikacji." * Wyjątek z ** MySQL **. Aby działało, dodałem więcej ustawień w klasie * DbConfiguration *: 'SetProviderFactory (" MySql.Data.MySqlClient ", new MySql.Data.MySqlClient.MySqlClientFactory()); SetProviderFactoryResolver (new MySql.Data.Entity.MySqlProviderFactoryResolver()); ' –

3

W wersji RC, to staje się:

 var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json") 
      .AddEnvironmentVariables(); 
     var Configuration = builder.Build(); 
     var connectionString = Configuration["Data:DefaultConnection:ConnectionString"]; 
1

Zanim zaczniesz, upewnij się, że na pełnej kompilacji Framework w twojej project.json as Entity Framework 6 nie obsługuje .NET Core. Jeśli potrzebujesz funkcji wieloplatformowych, musisz dokonać aktualizacji do Entity Framework Core.

W pliku project.json podaj jeden cel w pełnym zakresie.NET Framework:

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

a następnie ciągi połączeń Konfiguracja i wtrysk zależność

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

W klasie startowego w ConfigureServices dodać metodę fabryka context z jego ciąg połączenia. Kontekst powinien zostać rozwiązany raz na zakres, aby zapewnić wydajność i zapewnić niezawodne działanie Entity Framework.

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

    // Configure remaining services 
} 

ntity ramowa 6 umożliwia konfigurację być określone w XML (w web.config lub app.config) lub przez kod. Od wersji ASP.NET Core cała konfiguracja jest oparta na kodzie. Kod konfiguracji opartej

został osiągnięty poprzez utworzenie podklasy System.Data.Entity.Config.DbConfiguration i stosowania System.Data.Entity.DbConfigurationTypeAttribute do DbContext podklasy.

Nasz plik konfiguracyjny zwykle wyglądała tak:

<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> 

Element defaultConnectionFactory ustawia fabrykę połączeń. Jeśli ten atrybut nie jest ustawiony, domyślną wartością jest SqlConnectionProvider. Jeśli, z drugiej strony, zostanie podana wartość, dana klasa zostanie użyta do utworzenia metody DbConnection za pomocą jej metody CreateConnection. Jeśli dana fabryka nie ma domyślnego konstruktora następnie należy dodać parametry, które są wykorzystywane do konstruowania obiektowi

[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); 
    } 
} 

Ten artykuł pokaże, jak używać Entity Framework 6 wewnątrz aplikacji ASP.NET podstawowej. https://docs.asp.net/en/latest/data/entity-framework-6.html

Powiązane problemy