Linq To SQLite

Linq To SQLite

前幾天小章大發了一篇 [Entity Framework] SQLite 與 Entity Framework

剛好最近我也有用到SQLite,但我是用Linq To SQLite,而不是Entity Framework

雖然這兩個東西很像,但由於DBML Designer沒有提供生成SQLite資料庫的DBML的功能,

因此必須要靠第三方的元件來生出DBML。雖然比較麻煩,但提供給大家另一個選擇。

首先必須安裝SQLite的Provider

Latest file releases for the ADO.NET 2.0 Provider for SQLite

安裝完之後,就可以利用Visual Studio來建立資料庫的schema,

或是用 Navicat for SQLite 這套工具來幫助管理資料庫(有免費的中文版,還不錯)。

資料庫建完之後,接著要去下載這套 dblinq2007 ,用來生出dbml。

下載完解壓縮之後,長這個樣子

image

不過要注意一點的是,要去剛剛安裝的 Provider for SQLite下把一隻 dll 複製過來

不然會有

DbMetal: Could not load databaseConnectionType type 'System.Data.SQLite.SQLiteConnection,

System.Data.SQLite'.  Try using the --with-dbconnection=TYPE option.

這樣的錯誤。

 

預設路徑是C:\Program Files\SQLite.NET\bin 下的 System.Data.SQLite.dll

複製到 DbLinq-0.20.1資料夾

image

接著打開cmd(命令提示字元),輸入一些參數

DbMetal.exe /database:{DataContext的名稱} /namespace={命名空間} /code={檔名}

/provider=Sqlite  /conn="data source={DB的所在路徑}"

範例:

DbMetal.exe /database:MyDataContext  /namespace=MyProject.Model  /code=SQLiteModel.cs

/provider=Sqlite /conn="data source=D:\Project\MyProjects\DB\MySQLiteDB.db"

image

執行之後,就會在該資料夾下面產生一個cs檔出來。就可以把這個檔案複製到專案內

其內容就像工具替我們產生的一堆類別及DataContext。

接著專案內部要加入四個參考,分別是:

一個是Linq的 System.Data.Linq(.Net Framework提供)

另外兩個是在DbLinq-0.20.1資料夾下的 DbLinq.dll 及 DbLinq.Sqlite.dll

還有一個是Provider for SQLite資料夾下的 System.Data.SQLite.dll(就是前面copy的那隻)

加入後應該就可以build成功了。

另外還有一點是連線字串的設定,這邊提供一個簡單的Repository,可以稍微參考一下。


 public class BaseRepository
    {
        //連線字串
        private static SQLiteConnection _connectionString =
            new SQLiteConnection("DbLinqProvider=Sqlite;Data Source=" + 
                                 HttpContext.Current.Server.MapPath("~\\App_Data\\CodingRoad.db"));
        
        //DataContext
        protected CodingRoadDataContext db = new CodingRoadDataContext(_connectionString);

        //抓出所有Company Table的資料
        public IEnumerable<Company> GetAllCompany()
        {
            return db.Company;
        }

        //抓出一筆Company Table內的資料
        public Company GetSingleCompany(int id)
        {
            return db.Company.Where(p=>p.ID==id).FirstOrDefault();
        }

        //新增一筆資料到Company Table
        public void AddCompany(Company data)
        {
            db.Company.InsertOnSubmit(data);
            db.SubmitChanges();
        }
    }

 

處理完之後,資料層的部分就搞定了。

不過有一點要注意的是,如果資料庫的Schema有改變,就必須再用DbLinq重新產生一次cs檔。

雖然有點麻煩,但就是提供給另一種做法的選擇囉。