1.21 jigowatts

Great Scott!

データベース接続!Entity FrameworkのコードファーストでSQLServerに接続する?

概要

.NET Frameworkの比較的新しいテクノロジであるADO.NET Entity Frameworkのコードファースト呼ばれる方法でSQLServerに接続してみます。

ADO.NET Entity Framework

.NET Framework3.5 SP1リリース時に追加された比較的新しいテクノロジです。昨今のMicrosoftオープンソース化の波に乗り、Entity Frameworkもオープンソースコードとしてリリースされています。
ADO.NETの上位レベルAPIであり、中間層の部分で従来のADO.NETにパフォーマンスが劣る場合がありますが、今やるならこれは外せません。LINQとの組み合わせでコード量の少ないアプリケーションの作成、保守が可能となります。
中でもコードファーストでの開発は設定より規約(CoC)の思想により、データベース設計が完了していなくても開発ができます。

NuGetパッケージから最新のEntity Frameworkを取得します。
f:id:sh_yoshida:20150206004849p:plain

コンテキストの用意

コンテキストのコンストラクタに構成ファイルの接続文字列を引き渡すこともできます。指定されていない場合には、(localdb)\v11.0に接続します。
■DBConnection.DAL/LocalDBContext.cs

public class LocalDBContext : DbContext
{
    public LocalDBContext()
        : base("name=ADONetConnection")
    { }
    public DbSet<T_Work> t_works { get; set; }
}

■App.config

<connectionStrings>
  <add name="ADONetConnection" 
       connectionString="server=localhost\SQLEXPRESS;database=LocalDB;Integrated Security=True "
       providerName="System.Data.SqlClient" />
</connectionStrings>
エンティティの用意

■DBConnection.Entity/T_Work.cs

public class T_Work
{
    public int ID { get; set; }
    public string ProductCode { get; set; }
    public string ProductName { get; set; }
    public string CategoryNo { get; set; }
    public string Type { get; set; }
}
リポジトリインタフェースとリポジトリクラスの用意

■DBConnection.DAL/Abstractions/IRepositoryBase.cs

public interface IRepositoryBase<T>
{
    List<T> Select();
    void Insert(T data);
    void Update(T data);
    void Delete(T data);
}

■DBConnection.DAL/EFCodeFirstRepository.cs

public class EFCodeFirstRepository : IRepositoryBase<T_Work>
{
    private readonly LocalDBContext context = new LocalDBContext();

    public List<T_Work> Select() 
    {
        return context.t_works.Select(x => x).DefaultIfEmpty().ToList();
    }
    public void Insert(T_Work data) 
    {
        context.t_works.Add(data);
        context.SaveChanges();
    }
    public void Update(T_Work data) 
    {
        context.Entry<T_Work>(data).State = EntityState.Modified;
        context.SaveChanges();
    }
    public void Delete(T_Work data) 
    {
        context.Entry<T_Work>(data).State = EntityState.Deleted;
        context.SaveChanges();
    }
}
すごくシュッとしました!