MIT’s blog

個人的なメモかな

Entity Frameworkの謎

大昔、世の中にADO.NETがやっと現れた頃に早速飛びついて今回やってる事と同じ事を試してデータベース作成に挑み、1年分のデータ登録に1日とか余りの激遅に一旦投げた事があるんですが、月日が流れても便利な機能にはその代償があるんですかね? それとも単に自分自身が消化不良で機能を生かし切れていないのか^^;

今回のEntity Frameworkやコードファーストも凄く便利な機能で、随分と楽にデータベース開発が出来る様になったな~と必死に書いてるんですが、60ギガバイトのデータベースが悪いのかな~っとかDB分割によるダイエットも結局7分割まで行いました。でも、アクセスが非常に遅く、使い物にならないな~っと。データベース作成時はSQLiteの特性(?)でトランザクション明示的にするとかで、Entity Frameworkを避けて手動でパラメーター用意して登録するって変更とデバッグに相当な時間を費やしました。

出来上がったデータベース参照もまあ、もしかしたらDbContextのコンストラクタを上手く書き上げればクリア出来るものなのかもですが、デーベース作成時と同様に自力でオープンするスタイルに変更してみました。

using (var db = new KSD_DB())
{
    var races = db.RACEINFO.Where(r => r.JOUCD.StartsWith("0") ||
                                                                  r.JOUCD.StartsWith("1"))
                                              .OrderByDescending(r => r.KAISAIBI)
                                              .AsNoTracking()
                                              .ToArray();
    foreach (var race in races)
    {

って感じで書いてたものを

SqliteConnectionStringBuilder sqlBuilder = new SQLiteConnectionStringBuilder()
    {
        DataSource = "KSD_DB.db",
        ReadOnly = true
    };
using (SQLiteConnection con = new SQLiteConnection(sqlBuilder.ToString())
{
    con.Open();
    using (SQLiteCommand cmd = new SQLiteCommand(con))
    {
        cmd.CommandText = "SELECT KAISAIBI FROM RACEINFO " +
                                              "WHERE JOUCD LIKE '0%' OR JOUCD LIKE '1%' " +
                                              "ORDER BY KAISAIBI DESC";
        var races = cmd.ExecuteReader();
        while (races.Read())
        {

としてみると、数分掛かっていたツリービュー表示が数秒とやっと期待通りの反応になってくれました。もっと勉強してEntity Frameworkを使いこなせば、やりたい事が数秒で出来るのかは不明ですが、ここは作業進める事を優先します。ただ、Entity Frameworkってもうリリースから随分経つ訳で、あんな激遅では誰も使わない筈なので使い方把握出来てないだけと信じたいですね。そして、理解出来る日が近い将来来る事を願いグーグル先生に色々教えて貰えればと思います^^