新浪博客

EntityFrameworkCoreSQLite与WPF结合的使用

2019-02-23 20:52阅读:
EntityFrameworkCore SQLiteWPF结合的使用

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、绑定到WPFDataGrid

使用如下的代码既可以进行简单的绑定:
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

我的更多文章

下载客户端阅读体验更佳

APP专享