EntityFrameworkCoreSQLite与WPF结合的使用
2019-02-23 20:52阅读:
EntityFrameworkCore SQLite与WPF结合的使用
1、安装环境
在Nuget中输入Microsoft.EntityFrameworkCore.Sqlite进行安装,测试项目使用的是
Framework框架,结果引用中添加了二十几个DLL引用,我猜想如果使用的是.Net
Core框架,可能会少很多DLL引用,当然操作系统的DLL引用估计还是少不了。
个人猜想要是使用Code
First,应该能删除不少Dll,不清楚这些结构,不敢删除。
2、数据表的创建
这里定义两个数据表:
public class
ReplaceFolder
{
public
int ID {
get;
set; }
[Required,
Column('FolderName')]
public
string FolderName {
get;
set;
}//文件夹名称
[Required,
Column('ParentID'),
DefaultValue(-1)]
public
int ParentID {
get;
set; }
//所属的父文件夹ID,默认值为-1,则表示无父文件夹
public
string Description {
get;
set; }
//描述
publicList ReplaceRules {
get;
set; }
}
上面是一个带树形结构的数据表
下面是其中的子表(当然其中还含有子表,这里就不继续了):
public
class
ReplaceRule
{
public
int ID {
get;
set; }
[Required]
public
string RulesName {
get;
set;
}//规则名称
public
string Description {
get;
set; }
//描述
[Required]
public
int ReplaceFolderID {
get;
set; }
//所属的父文件夹ID,如果是ID,必须是表名加上ID组成
publicList ReplaceGroups {
get;
set; }
}
定义数据库对象:
public class
DataContext :
DbContext
{
publicDataContext()
:
base()
{
}
protected
override
voidOnConfiguring(DbContextOptionsBuilder
optionsBuilder)
{
optionsBuilder.UseSqlite('Data
Source=Sqlite.db');
//无数据库则创建
}
//部件数据表
publicDbSet Parts {
get;
set; }
//替换规则数据表
publicDbSet ReplaceFolders
{ get;
set;
}//文件夹
publicDbSet ReplaceRules {
get;
set;
}//规则
…
protected
override
voidOnModelCreating(ModelBuilder
modelBuilder)
{
modelBuilder.Entity().HasIndex(t =>
new {
t.RulesName,t.ReplaceFolderID }).IsUnique();
modelBuilder.Entity().HasIndex(t =>
new { t.GroupName,t.ReplaceRuleID
}).IsUnique();
…
}
}
问题点:如果一个子表,其名称和所属的父键共同组成唯一项标识,譬如在一个文件夹下,子项文件名称不能重复,但在不同的文件夹下,子项文件名称是可以重复的,如何声明呢?
很简单,子项是不能使用文件名称作为主键的(因为主键本身就是唯一标识),这时如上述的ReplaceRule表定义,仍旧使用ID作为主键,然后在OnModelCreating中如上述代码添加限制代码即可(网上查了很久没找到,原来如此简单)
modelBuilder.Entity().HasIndex(t =>
new {
t.RulesName,t.ReplaceFolderID }).IsUnique();
3、绑定到WPF的DataGrid
使用如下的代码既可以进行简单的绑定:
ReplaceFolder parentFolder =parentTree.Key
asReplaceFolder;
var nodes =
TreeRulesSource.Where(s => s.ReplaceFolderID==
parentFolder.ID).ToList();
问题点:绑定到DataGrid后,我想进行各种添加/删除/修改操作,甚至还有撤销/还原操作,最后再点击一个Save按钮来保存到数据库,如何实现呢?(注意:如果采用及时更新方式则不需要下述方法)
可能很多人会想到ObservableCollectio集合,不错,是用它,但如何把ObservableCollectio集合对应的修改数据又反过来更新到数据库呢?我这里使用了ObservableCollectio集合的扩展:
public
class
ObservableCollectionEx<<span
se-mark='1'>T>
:ObservableCollection
{
publicList
AddedItems;
publicList
DeletedItems;
#region
构造函数
publicObservableCollectionEx()
: base()
{
AddedItems =
new List();
DeletedItems =
new List();
}
publicObservableCollectionEx(List
list) : base(list)
{
AddedItems =
new List();
DeletedItems =
new List();
}
publicObservableCollectionEx(IEnumerable
collection) :
base(collection)
{
AddedItems =
new List();
D