Multiple dbContexts in ASP.NET vNext and EF7

前端 未结 2 1366
忘了有多久
忘了有多久 2021-02-06 12:26

I\'m trying to get along with building web systems with ASP.NET vNext using MVC 6 and EF7. I\'m looking at this tutorial: http://stephenwalther.com/archive/2015/01/17/asp-net-5-

相关标签:
2条回答
  • 2021-02-06 13:05

    Important Note: The syntax for configuring the Entity Framework 7 services has changed since this post, which was accurate as of the last few beta rounds. The same idea should still apply to the new syntax though.

    Here is what I've been doing:

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

    where StorageSettings:SQLConnectionString is a connection string for a SQL Express database. Currently, I have both DataContextA and DataContextB sharing the same database, but you can keep them separate. If you want to keep using the Configuration method (which I wasn't aware of, pretty cool!) you could do something like this:

    {
        "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"
            }
        }
    }
    

    with

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

    Both DataContextA and DataContextB can be injected into your controller:

    public class MyController: Controller {
        public MyController(DataContextA dataA, DataContextB dataB) {
            // Do stuff
        }
    }
    
    0 讨论(0)
  • 2021-02-06 13:19

    First of all, in something like config.json you can add yur connection strings. Something like the following will work

      "Data": {
        "BlogData": { "ConnectionString": "Server=tcp:YourHostname.net,1433;Database=YourDatabaseName;User ID=YourDBUser@YourDomain;Password=YourPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" },
        "Identity": { "ConnectionString": "Server=tcp:YourHostname.net,1433;Database=YourDatabaseName;User ID=YourDBUser@YourDomain;Password=YourPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" }
      },
    

    You then have two DBContexts. Let's say: YourApp.AppDBContext and YourApp.AppIdentityDBContext

    You need to include these at the top of your CS file of course.

    using YourApp.AppDBContext;
    using YourApp.AppIdentityDBContext;
    

    In startup.cs for example, in the startup method, your configuration builder will look like this:

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

    In the ConfigureServices method you will add your DBContexts as follows:

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

    I hope this helps. Feel free to give me a shout if I can expand on this further.

    0 讨论(0)
提交回复
热议问题