5

Я пытаюсь ладить с созданием веб-систем с помощью ASP.NET vNext с использованием MVC 6 и EF7. Я смотрю на этом уроке: http://stephenwalther.com/archive/2015/01/17/asp-net-5-and-angularjs-part-4-using-entity-framework-7Несколько dbContexts в ASP.NET vNext и EF7

На странице вы увидите, как добавить DbContext в проект, и это регистрируется в файле запуска, как это:

// Register Entity Framework 
services.AddEntityFramework(Configuration) 
     .AddSqlServer() 
     .AddDbContext<MoviesAppContext>(); 

И выглядит контекст класс вот так:

public class MoviesAppContext:DbContext 
{ 
    public DbSet<Movie> Movies { get; set; } 
} 

Все это работает хорошо, но теперь мне нужно добавить дополнительный DbContext. Хотя я не знаю, как зарегистрировать этот дополнительный контекст, чтобы он использовался EF и можно было использовать в моем проекте.

Допустим, я создал новый контекст, как это:

public class MyNewSuper:DbContext 
{ 
    public DbSet<Model1> Model1 { get; set; } 
    public DbSet<Model2> Model2 { get; set; } 
} 

Как я иду вперед, чтобы зарегистрировать его для использования в моем проекте тогда?

+0

Вы пытались добавить в список 'DbContexts'? 'Services.AddEntityFramework (Конфигурация) .AddSqlServer() .AddDbContext () .AddDbContext ();' – Michael

+0

Неужели вы не можете делать все это с одного контекста и трех лиц в этом контексте? –

+0

Если ваш 'DBSet' находятся в одной базе данных, используйте тот же 'DbContext'. Если они находятся в разных базах данных, вам нужно будет сделать гораздо больше, если вы хотите получить правильное транзакционное поведение. – Alex

ответ

14

Важное примечание: Синтаксис для настройки служб Entity Framework 7 изменился с момента публикации, что было точным с последних нескольких бета-раундов. Однако такая же идея должна применяться и к новому синтаксису.

Вот что я делаю:

services.AddEntityFramework().AddSqlServer() 
       .AddDbContext<DataContextA>(options => options.UseSqlServer(Configuration.Get("StorageSettings:SQLConnectionString"))) 
       .AddDbContext<DataContextB>(options => options.UseSqlServer(Configuration.Get("StorageSettings:SQLConnectionString"))); 

где StorageSettings:SQLConnectionString является строка подключения для базы данных SQL Express. В настоящее время у меня есть и DataContextA, и DataContextB, которые используют одну и ту же базу данных, но вы можете сохранить их отдельно. (!, Который я не знал, довольно прохладно) Если вы хотите сохранить с помощью метода Configuration вы могли бы сделать что-то вроде этого:

{ 
    "Data": { 
     "DefaultConnectionA": { 
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ContextADatabase;Trusted_Connection=True;MultipleActiveResultSets=true", 
     "DefaultConnectionB": { 
      "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=ContextBDatabase;Trusted_Connection=True;MultipleActiveResultSets=true" 
     } 
    }, 
    "EntityFramework": { 
     "DataContextA": { 
      "ConnectionStringKey": "Data:DefaultConnectionA:ConnectionString" 
     }    
     "DataContextB": { 
      "ConnectionStringKey": "Data:DefaultConnectionB:ConnectionString" 
     } 
    } 
} 

с

services.AddEntityFramework(Configuration) 
       .AddSqlServer() 
       .AddDbContext<DataContextA>() 
       .AddDbContext<DataContextB>(); 

Оба DataContextA и DataContextB могут быть вводится в ваш контроллер:

public class MyController: Controller { 
    public MyController(DataContextA dataA, DataContextB dataB) { 
     // Do stuff 
    } 
} 
+0

Спасибо за пример, я попытаюсь попробовать это позже. – jimutt

+1

Как это работает с Migrations? Как миграция разделяется в таблице миграций при использовании одной и той же базы данных, но нескольких контекстов db? @cuddlebunny – dotnethaggis

+0

@dotnethaggis Я не пробовал ничего подобного. Если у вас две базы данных, я должен получить две отдельные таблицы миграции: по одной на базу данных. Если у вас есть только один, но два DbContexts, я надеюсь, что он имеет только одну таблицу миграции, которая является общей. Я не уверен, хотя, попробуйте и посмотрите, что произойдет! – CuddleBunny

1

Прежде всего, что-то вроде config.json, вы можете добавить строки подключения юра. Что-то вроде следующего будет работать

"Data": { 
    "BlogData": { "ConnectionString": "Server=tcp:YourHostname.net,1433;Database=YourDatabaseName;User [email protected];Password=YourPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" }, 
    "Identity": { "ConnectionString": "Server=tcp:YourHostname.net,1433;Database=YourDatabaseName;User [email protected];Password=YourPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" } 
    }, 

У вас тогда есть два DBC-текста. Скажем: YourApp.AppDBContext и YourApp.AppIdentityDBContext

Конечно, вам нужно включить их в начало своего файла CS.

using YourApp.AppDBContext; 
using YourApp.AppIdentityDBContext; 

В startup.cs, например, в способе запуска, ваша конфигурация строитель будет выглядеть следующим образом:

var builder = new ConfigurationBuilder() 
     .AddJsonFile("config.json") 
     .AddJsonFile($"config.{env.EnvironmentName}.json", optional: true); 
    builder.AddEnvironmentVariables(); 
    Configuration = builder.Build(); 
} 

В методе ConfigureServices вы будете добавлять ваши DBContexts следующим образом:

services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<AppDbContext>(options => 
      options.UseSqlServer(Configuration["Data:BlogData:ConnectionString"])) 
     .AddDbContext<AppIdentityDbContext>(options => 
      options.UseSqlServer(Configuration["Data:Identity:ConnectionString"])); 

Надеюсь, это поможет.Не стесняйтесь кричать, если я могу расширить это дальше.