なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Entity Framework で コード内から接続先やプロバイダを指定する

Entity Framework で、 C# コード内から、接続文字列や接続プロバイダを指定する方法。

まぁ app.configconnectionStrings を定義せずに接続するみたいな感じ。

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.configconnectionStrings を設定しなくても接続できる。
やり方的には、新しく PersonContext で接続を作るのではなくて、すでにある接続を使う感じ。

MSDN にかいてあった。

DbContext コンストラクター (DbConnection, Boolean) (System.Data.Entity)

ということで、メモでした。


ついでだけど、 Entity Framework は Person クラスの場合は People テーブルを見に行くらしい。