Entity Framework で、 C# コード内から、接続文字列や接続プロバイダを指定する方法。
まぁ app.config
に connectionStrings
を定義せずに接続するみたいな感じ。
Entity Framework の使い方みたいなサイトを見ると、たいてい Code First でやってたり、
app.config
に接続先を指定しているみたいなのが多いけど、
コードから接続先やプロバイダを指定する方法を使うことになったので、メモ。
対象
- Entity Framework 6.1.3
- System.Data.SQLite.EF6 1.0.98.1
通常は下のような感じでする(はず)。
using System.Data.Entity; using Experiment.ConsoleApp.Models; namespace Experiment.ConsoleApp { public class PersonContext : DbContext { public PersonContext() : base("PersonContext") { } public DbSet<Person> People { get; set; } } }
App.config
<?xml version="1.0" encoding="utf-8"?> <configuration> ...(省略)... <connectionStrings> <add name="PersonContext" connectionString="Data Source=./app.db;" providerName="System.Data.SQLite" /> </connectionStrings> </configuration>
そうすれば、接続していい感じにしてくれる。
次は、コード内でやる方法。
上のコードを改変する感じで。
using System.Data.Common; using System.Data.Entity; using Experiment.ConsoleApp.Models; namespace Experiment.ConsoleApp { public class PersonContext : DbContext { public PersonContext(DbConnection connection) : base(connection, true) { } public DbSet<Person> People { get; set; } } }
using System; using System.Data.Common; namespace Experiment.ConsoleApp { internal class Program { private static void Main(string[] args) { var connection = DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection(); connection.ConnectionString = "Data Source=./app.db"; using (var context = new PersonContext(connection)) { foreach (var person in context.People) { Console.WriteLine($"{person.FirstName} {person.LastName} ({person.Age})"); } } Console.ReadLine(); } } }
こうすれば、app.config
に connectionStrings
を設定しなくても接続できる。
やり方的には、新しく PersonContext
で接続を作るのではなくて、すでにある接続を使う感じ。
MSDN にかいてあった。
DbContext コンストラクター (DbConnection, Boolean) (System.Data.Entity)
ということで、メモでした。
ついでだけど、 Entity Framework は Person
クラスの場合は People
テーブルを見に行くらしい。