読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

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

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



通常は下のような感じでする(はず)。

PersonContext.cs

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>

そうすれば、接続していい感じにしてくれる。



次は、コード内でやる方法。
上のコードを改変する感じで。

PersonContext.cs

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

Program.cs

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 テーブルを見に行くらしい。