如何在UWP中使用EF 7並使用.Net環境輕量的SQL資料庫! [EF 7.0 + SQLite on UWP]
好久沒有寫Blog了,今天來介紹一下EntityFramework 7 + UWP + SQLite + UWP。在UWP的框架下並沒有原生的Database可以使用,而SQLite算是較為輕量且也有在其他平台都有支援。
EntifyFramework則是可以使用Linq + OOP的方式存取資料庫的好套件,然而在EF7則是變成只能用Code First開發。
Demo環境是Windows 10 10586.164 + VS2015U1 + UWP 10586 SDK
先把幾個Nuget套件以及Reference加入到專案中,可以使用project.json或是採用GUI(在專案滑鼠右鍵可以管理Nuget套件)加入以下兩行的Jsom
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.Sqlite": "7.0.0-rc1-final",
目前EF的版本在Nuget上還是以Rc1-final作為結尾需要用到的是Commands以及Sqlite,Commands則是在使用Command來長出db的schema以及相關檔案!而SQLite則是和SQLite作為介接的EF。
然後在加入已經和VS一同安裝的Visual Studio C++ 2015 for Universal Windows Platform Apps.
接者就來寫Table的Model吧!以下用 " 部落格 -- 文章 " 的關係做資料庫!
public class ArticleModel : BaseModel
{
[Key]
public int AritcleIndex { get; set; }
private string _ArticleTitle;
[Required]
public string ArticleTitle
{
get { return _ArticleTitle; }
set
{
if (_ArticleTitle != value)
{
_ArticleTitle = value;
NotifyChanged();
}
}
}
private DateTime _CreateTime;
[Required]
public DateTime CreateTime
{
get { return _CreateTime; }
set
{
if (_CreateTime != value)
{
_CreateTime = value;
NotifyChanged();
}
}
}
private string _ArticleContent;
public string ArticleContent
{
get { return _ArticleContent; }
set
{
if (_ArticleContent != value)
{
_ArticleContent = value;
NotifyChanged();
}
}
}
以上就是Articale的Model並且設定ArticleIndex為Key。
然後加入BlogDbContext的檔案
public class BlogDbContext : DbContext
{
public DbSet<ArticleModel> Articles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionString = "SampleDb.db";
try
{
connectionString = Path.Combine(ApplicationData.Current.LocalFolder.Path, $"{connectionString}");
}
catch(InvalidOperationException ioEx)
{
}
optionsBuilder.UseSqlite($"Data Source = {connectionString}");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.Entity<ArticleModel>().Property(p => p.AritcleIndex).IsRequired();
}
}
這邊需要注意到的是要使用try-catch將ApplicationData.Current.LocalFolder.Path包起來!要不然會有Exception出現,然後在OnModelCreating的codeblock可以調整Model的一些屬性。
接者在App.xaml.cs的App建構子最後加上
using (var db = new BlogDbContext())
{
db.Database.Migrate();
}
這樣db在APP執行的時候竟會執行Migrate的動作。
但是這樣只是先把Code的行為寫好,由於EF7已經變成CodeFirst的開發方式!所以需要在使用指令讓schema檔案長出來。
在Tools -> Nuget Package Manager -> Package Manager Console的視窗叫出後並打上一下指令
Add-Migration " DemoMigration "
如果成功就會長出Migration的資料夾以及相關cs檔!
而如果錯誤的話請把Migration的資料夾刪除並在Package Manager Console輸入以下指令
Remove-Migration
這樣就算是設定好SQLite以及EF7!接者使用正常的Linq + OOP (物件導向設計)來開發CRUD的資料庫功能!
***以上Code以及說明都有可能隨著Windows 10 的版本以及Visual Studio 2015版本有所調整!***
參考資料 MSDN, Windows Dev Center
下次再分享Windows 10 的新技術拉~