本篇是.net 中 使用 SQLite(普通版)( https://blog.csdn.net/qq_23219257/article/details/132171167) 的进阶篇。
在现代软件开发中,使用数据库是不可或缺的一部分。对于.NET开发者来说,SQLite是一种常用的轻量级关系型数据库。为了更方便地与数据库进行交互,开发者通常使用ORM(对象关系映射)工具。本文将介绍在.NET平台上如何使用ORM操作SQLite数据库,以实现轻便快捷的使用SQLite。
ORM是一种现代编程技术,可认为是中间件,用于将对象模型与关系型数据库之间建立映射关系。通过ORM,开发者可以使用面向对象的方式操作数据库,而无需编写复杂的SQL语句。
SQLite是一种轻量级的嵌入式数据库,其特点是小巧、快速和可靠。对于需要在应用程序中集成数据库功能的.NET开发者来说,SQLite是一个理想的选择,尤其是需要本地数据的支持的情况下,SQLite是优先选择的,当然也有自定义数据的,需要根据实际情况来取舍的。
在.NET平台上,有许多优秀的ORM工具可供选择,如Entity Framework、Dapper和NHibernate等。根据项目需求和开发者的偏好,选择合适的ORM工具是非常重要的,本篇用EF来制作,有兴趣的可以试试其它方案。
首先,我们需要在Visual Studio中安装Entity Framework。可以通过NuGet包管理器来安装Entity Framework。
接下来,我们需要根据数据库结构创建数据模型。可以使用代码优先或数据库优先两种方式创建数据模型。
如果选择代码优先方式,可以通过编写实体类来定义数据模型。Entity Framework会根据实体类的属性和关系自动生成数据库结构。
如果选择数据库优先方式,可以使用Entity Framework的逆向工程功能自动生成实体类。只需提供SQLite数据库连接字符串,Entity Framework将根据数据库结构生成实体类。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace LocalArticle.Model
{
class CodeType
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Display(Name = “类型id”)]
public string code_type_id { get; set; }
public string parent_id { get; set; }
public string order_id { get; set; }
public string type { get; set; }
public string isdel { get; set; }
}
}
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace LocalArticle.Model
{
class Code
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string code_id { get; set; }
public string code_type_id { get; set; }
[ForeignKey(“code_type_id”)]
public CodeType CodeType { get; set; }
public string title { get; set; }
public string code_content_id { get; set; }
[ForeignKey(“code_content_id”)]
public CodeContent CodeContent { get; set; }
[Display(Name = “创建时间”)] public DateTime createtime { get; set; }
[Display(Name = “修改时间”)] public DateTime updatetime { get; set; }
}
}
每个数据模型有对应的数据表,其它的数据表有对应的数据模型。
一旦创建了数据模型,就可以使用Entity Framework来执行CRUD(增删改查)操作。以下是一些常见的操作示例:
private void searchBtn_Click(object sender, EventArgs e)
{
this.code_id = "";
this.selectedIndex = -1;
using (AppDbContext db = new AppDbContext())
{
var model = db.code.Where(s => !s.code_id.Equals("1"));
if (this.typeComboBox.SelectedIndex != -1)
{
string code_type_id = this.typeComboBox.SelectedValue.ToString();
model = model.Where(m => m.code_type_id.Equals(this.typeComboBox.SelectedValue));
}
if (!string.IsNullOrEmpty(this.keywordTextBox.Text))
{
model = model.Where(m => m.title.Contains(this.keywordTextBox.Text));
}
UiDataS.Instance.LoadDataForListBox(this.titleListBox, model.ToList());
this.searchBtn.Text = "搜索";
}
}
private async void addBtn_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.typeComboBoxForAdd.Text) || this.typeComboBoxForAdd.SelectedIndex == -1)
{
MessageBox.Show("请选择分类(如果没有分类,请先添加)");
ShowCodeTypeForm();
return;
}
if (string.IsNullOrEmpty(this.titleTextBoxForAdd.Text))
{
MessageBox.Show("请输入标题");
return;
}
if (string.IsNullOrEmpty(this.contentRichTextBoxForAdd.Text))
{
MessageBox.Show("请输入记事内容");
return;
}
using (AppDbContext db = new AppDbContext())
{
Code model = new Code();
model.code_type_id = this.typeComboBoxForAdd.SelectedValue.ToString();
model.title = this.titleTextBoxForAdd.Text;
model.createtime = DateTime.Now;
model.updatetime = DateTime.Now;
model.CodeContent = new CodeContent();
model.code_content_id = model.CodeContent.code_content_id;
await db.code.AddAsync(model);
code_id = model.code_id;
string pathParent = DataS.Instance.UserReposPath + model.createtime.Year;
if (!Directory.Exists(pathParent))
{
Directory.CreateDirectory(pathParent);
}
//还是得需要扩展名的,需要存储在lfs空间上(内容不要站用code的空间)
string path = pathParent + "\\" + model.code_content_id + ".rtf";
File.WriteAllText(path, this.contentRichTextBoxForAdd.Text);
this.contentRichTextBoxForAdd.SaveFile(path, RichTextBoxStreamType.RichText);
model.CodeContent.content = model.createtime.Year + "\\" + model.code_content_id + ".rtf";
await db.SaveChangesAsync();
sum++;
this.Text = "记事(有则用,无则加):" + sum;
}
this.titleTextBoxForAdd.Text = "";
this.contentRichTextBoxForAdd.Text = "";
}
private async void saveForEdit_Click(object sender, EventArgs e)
{
if (this.typeComboBoxForEdit.SelectedIndex == -1)
{
MessageBox.Show("请选择类型");
return;
}
if (string.IsNullOrEmpty(this.titleTextBoxForEdit.Text))
{
MessageBox.Show("请输入标题");
return;
}
if (string.IsNullOrEmpty(this.contentRichTextBoxForEdit.Text))
{
MessageBox.Show("请输入记事内容");
return;
}
using (AppDbContext db = new AppDbContext())
{
var model = await db.code.Include(m => m.CodeContent).FirstOrDefaultAsync(m => m.code_id.Equals(code_id));
if (model == null)
{
MessageBox.Show("没有找到相应的记录,请核查");
return;
}
model.updatetime = DateTime.Now;
model.code_type_id = this.typeComboBoxForEdit.SelectedValue.ToString();
model.title = this.titleTextBoxForEdit.Text;
FileInfo fileInfo = new FileInfo(DataS.Instance.UserReposPath + model.CodeContent.content);
if (!fileInfo.Exists)
{
Directory.CreateDirectory(fileInfo.Directory.ToString());
}
this.contentRichTextBoxForEdit.SaveFile(fileInfo.FullName, RichTextBoxStreamType.RichText);
db.code.Update(model);
await db.SaveChangesAsync();
}
}
一般情况下,不会采用物理删除的方式,来删除数据,会采用逻辑删除,这个和上面更新数据是一样的操作,就不在赘述了。
通过使用ORM工具,如EF,开发者可以更方便地在.NET平台上操作数据库。ORM提供了一种简化数据库交互的方式,使开发过程更加高效和便捷。无论是查询、插入、更新还是删除数据,ORM工具都能提供强大的支持。因此,掌握并善用ORM工具对于.NET开发者来说是非常重要的技能。
.net 中 使用 sqlite(普通版)
本地分类记事1.2.7