WPF 使用sqllite 入门开发教程
bigegpt 2025-01-05 15:50 34 浏览
创建应用程序
- 打开 Visual Studio
- 在开始窗口中,选择Create new project。
- 搜索“WPF”,选择WPF App (.NET Core),然后选择Next。
- 在下一个屏幕上,为项目命名,例如GetStartedWPF,然后选择Create。
安装实体框架 NuGet 包
- 右键单击解决方案并选择管理解决方案的 NuGet 包...
- entityframeworkcore.sqlite在搜索框中输入。
- 选择Microsoft.EntityFrameworkCore.Sqlite包。
- 检查右窗格中的项目,然后单击安装
- 重复这些步骤以搜索entityframeworkcore.proxies并安装Microsoft.EntityFrameworkCore.Proxies。
笔记
当您安装 Sqlite 包时,它会自动拉下相关的Microsoft.EntityFrameworkCore基础包。Microsoft.EntityFrameworkCore.Proxies包提供对“延迟加载”数据的支持。这意味着当您拥有带有子实体的实体时,在初始加载时只会获取父实体。代理检测何时尝试访问子实体并根据需要自动加载它们。
定义模型
在本演练中,您将使用“代码优先”实现模型。这意味着 EF Core 将根据您定义的 C# 类创建数据库表和架构。
添加一个新的类。给它命名:Product.cs并像这样填充它:
Product.cs
C#复制
namespace GetStartedWPF
{
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
}
接下来,添加一个名为的类Category.cs并使用以下代码填充它:
Category.cs
C#复制
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace GetStartedWPF
{
public class Category
{
public int CategoryId { get; set; }
public string Name { get; set; }
public virtual ICollection<Product>
Products
{ get; private set; } =
new ObservableCollection<Product>();
}
}
Category类的Products属性和Product类的Category属性是导航属性。在 Entity Framework 中,导航属性提供了一种导航两种实体类型之间关系的方法。
除了定义实体之外,您还需要定义一个派生自 DbContext 并公开 DbSet<TEntity> 属性的类。DbSet<TEntity> 属性让上下文知道您想要在模型中包含哪些类型。
DbContext 派生类型的实例在运行时管理实体对象,其中包括使用来自数据库的数据填充对象、更改跟踪以及将数据持久保存到数据库中。
ProductContext.cs使用以下定义向项目添加一个新类:
ProductContext.cs
C#复制
using Microsoft.EntityFrameworkCore;
namespace GetStartedWPF
{
public class ProductContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnConfiguring(
DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(
"Data Source=products.db");
optionsBuilder.UseLazyLoadingProxies();
}
}
}
- DbSet通知 EF Core 应将哪些 C# 实体映射到数据库。
- 有多种方法可以配置 EF Core DbContext。您可以在:配置 DbContext中了解它们。
- 此示例使用OnConfiguring覆盖来指定 Sqlite 数据文件。
- 该UseLazyLoadingProxies调用告诉 EF Core 实现延迟加载,因此在从父实体访问时会自动加载子实体。
按CTRL+SHIFT+B或导航到Build > Build Solution以编译项目。
了解不同之处在于使您的数据库和 EF Core 模型保持同步:管理数据库架构。
延迟加载
Category类的Products属性和Product类的Category属性是导航属性。在 Entity Framework Core 中,导航属性提供了一种导航两种实体类型之间关系的方法。
EF Core 为您提供了在您首次访问导航属性时自动从数据库加载相关实体的选项。使用这种类型的加载(称为延迟加载),请注意,当您第一次访问每个导航属性时,如果内容不在上下文中,将对数据库执行单独的查询。
使用“普通旧 C# 对象”(POCO) 实体类型时,EF Core 通过在运行时创建派生代理类型的实例,然后覆盖类中的虚拟属性以添加加载挂钩来实现延迟加载。要延迟加载相关对象,您必须将导航属性 getter 声明为公共和虚拟的(在 Visual Basic 中为Overridable),并且您的类不得密封(在 Visual Basic 中为NotOverridable)。使用 Database First 时,导航属性会自动变为虚拟以启用延迟加载。
将对象绑定到控件
添加模型中定义的类作为此 WPF 应用程序的数据源。
- 在解决方案资源管理器中双击MainWindow.xaml打开主窗体
- 选择XAML选项卡以编辑 XAML。
- 在开始Window标记之后,立即添加以下源以连接到 EF Core 实体。
- XAML复制
- <Window x:Class="GetStartedWPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:GetStartedWPF" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded"> <Window.Resources> <CollectionViewSource x:Key="categoryViewSource"/> <CollectionViewSource x:Key="categoryProductsViewSource" Source="{Binding Products, Source={StaticResource categoryViewSource}}"/> </Window.Resources>
- 这为“父”类别设置了来源,为“详细”产品设置了第二个来源。
- 接下来,在开始标记之后将以下标记添加到您的 XAML Grid。
- XAML复制
- <DataGrid x:Name="categoryDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource categoryViewSource}}" Margin="13,13,43,229" RowDetailsVisibilityMode="VisibleWhenSelected"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding CategoryId}" Header="Category Id" Width="SizeToHeader" IsReadOnly="True"/> <DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="*"/> </DataGrid.Columns> </DataGrid>
- 请注意,CategoryId之所以设置为ReadOnly,是因为它是由数据库分配的,无法更改。
添加详细信息网格
现在网格已经存在以显示类别,可以添加详细信息网格来显示产品。将此添加到 Grid元素内,在类别DataGrid元素之后。
MainWindow.xaml
XAML复制
<DataGrid x:Name="productsDataGrid" AutoGenerateColumns="False"
EnableRowVirtualization="True"
ItemsSource="{Binding Source={StaticResource categoryProductsViewSource}}"
Margin="13,205,43,108" RowDetailsVisibilityMode="VisibleWhenSelected"
RenderTransformOrigin="0.488,0.251">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding CategoryId}"
Header="Category Id" Width="SizeToHeader"
IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding ProductId}" Header="Product Id"
Width="SizeToHeader" IsReadOnly="True"/>
<DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="*"/>
</DataGrid.Columns>
</DataGrid>
最后,Save在 click 事件中添加一个按钮和连线到Button_Click.
XAML复制
<Button Content="Save" HorizontalAlignment="Center" Margin="0,240,0,0"
Click="Button_Click" Height="20" Width="123"/>
您的设计视图应如下所示:
添加处理数据交互的代码
是时候向主窗口添加一些事件处理程序了。
- 在 XAML 窗口中,单击<Window>元素以选择主窗口。
- 在“属性”窗口中选择右上角的“事件”,然后双击“已加载”标签右侧的文本框。
这会将您带到表单背后的代码,我们现在将编辑代码以使用ProductContext来执行数据访问。如下所示更新代码。
该代码声明了一个长时间运行的ProductContext. 该ProductContext对象用于查询和保存数据到数据库。然后从覆盖的方法调用实例上Dispose()的方法。代码注释解释了每个步骤的作用。ProductContextOnClosing
MainWindow.xaml.cs
C#复制
using Microsoft.EntityFrameworkCore;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
namespace GetStartedWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private readonly ProductContext _context =
new ProductContext();
private CollectionViewSource categoryViewSource;
public MainWindow()
{
InitializeComponent();
categoryViewSource =
(CollectionViewSource)FindResource(nameof(categoryViewSource));
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// this is for demo purposes only, to make it easier
// to get up and running
_context.Database.EnsureCreated();
// load the entities into EF Core
_context.Categories.Load();
// bind to the source
categoryViewSource.Source =
_context.Categories.Local.ToObservableCollection();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// all changes are automatically tracked, including
// deletes!
_context.SaveChanges();
// this forces the grid to refresh to latest values
categoryDataGrid.Items.Refresh();
productsDataGrid.Items.Refresh();
}
protected override void OnClosing(CancelEventArgs e)
{
// clean up database connections
_context.Dispose();
base.OnClosing(e);
}
}
}
笔记
该代码在第一次运行时使用调用来EnsureCreated()构建数据库。这对于演示是可以接受的,但在生产应用程序中,您应该查看迁移以管理您的架构。代码也同步执行,因为它使用本地 SQLite 数据库。对于通常涉及远程服务器的生产场景,请考虑使用Load和SaveChanges方法的异步版本。
相关推荐
- 5分钟搭建公网https网页文件服务器,免费权威TLS证书
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习前言本文主要讲解如何快速搭建一个https网页文件服务器,并免费申请权威机构颁发的tls证...
- nginx负载均衡配置(nginx负载均衡配置两个程序副本)
-
Nginx是什么没有听过Nginx?那么一定听过它的“同行”Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(UniformResources...
- 19《Nginx 入门教程》Nginx综合实践
-
今天我们将基于Nginx完成两个比较有用的场景,但是用到的Nginx的配置非常简单。内部Yum源搭建内部Pip源搭建1.实验环境ceph1centos7.6内网ip:172.16....
- Nginx性能调优与优化指南(nginx优化配置大全)
-
Nginx性能调优需要结合服务器硬件资源、业务场景和负载特征进行针对性优化。以下是一些关键优化方向和具体配置示例:一、Nginx配置优化1.进程与连接数优化nginxworker_process...
- C++后端开发必须彻底搞懂Nginx,从原理到实战(高级篇)
-
本文为Nginx实操高级篇。通过配置Nginx配置文件,实现正向代理、反向代理、负载均衡、Nginx缓存、动静分离和高可用Nginx6种功能,并对Nginx的原理作进一步的解析。当需...
- 【Nginx】史上最全的Nginx配置详解
-
Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,http块又包括http全局块和server块。Nginx是非常重要的负载均衡中间件,被广泛应用于大型...
- 【Nginx】Nginx 4种常见配置实例(nginx基本配置与参数说明)
-
本文主要介绍nginx4种常见的配置实例。Nginx实现反向代理;Nginx实现负载均衡;Nginx实现动静分离;Nginx实现高可用集群;Nginx4种常见配置实例如下:一、Nginx反向代理配...
- 使用nginx+allure管理自动化测试报告
-
allure在自动化测试中经常用来生成漂亮的报告,但是网上及官网上给出的例子都仅仅是针对单个测试用例文件的形式介绍的,实际使用中,自动化测试往往需要包含不止一个产品或项目,本文介绍如何使用nginx+...
- nginx配置文件详解(nginx配置文件详解高清版)
-
Nginx是一个强大的免费开源的HTTP服务器和反向代理服务器。在Web开发项目中,nginx常用作为静态文件服务器处理静态文件,并负责将动态请求转发至应用服务器(如Django,Flask,et...
- SpringCloud Eureka-服务注册与发现
-
1.Eureka介绍1.1学习Eureka前的说明目前主流的服务注册&发现的组件是Nacos,但是Eureka作为老牌经典的服务注册&发现技术还是有必要学习一下,原因:(1)一些早期的分布式微服...
- 微服务 Spring Cloud 实战 Eureka+Gateway+Feign+Hystrix
-
前言我所在项目组刚接到一个微服务改造需求,技术选型为SpringCloud,具体需求是把部分项目使用SpringCloud技术进行重构。本篇文章中介绍了Eureka、Gateway、Fe...
- 深度剖析 Spring Cloud Eureka 底层实现原理
-
你作为一名互联网大厂后端技术开发人员,在构建分布式系统时,是不是常常为服务的注册与发现而头疼?你是否好奇,像SpringCloudEureka这样被广泛使用的组件,它的底层实现原理到底是怎样的...
- 热爱生活,喜欢折腾。(很热爱生活)
-
原文是stackoverflow的一则高票回答,原文链接可能之前也有人翻译过,但是刚好自己也有疑惑,所以搬运一下,个人水平有限所以可能翻译存在误差,欢迎指正(如侵删)。尽管classmethod和st...
- GDB调试的高级技巧(详细描述gdb调试程序的全过程)
-
GDB是我们平时调试c/c++程序的利器,查起复杂的bug问题,比打印大法要好得多,但是也不得不说,gdb在默认情况下用起来并不是很好用,最近学习到几个高级点的技巧,分享下:一美化打印先上个例子...
- Arduino 实例(二十三)Arduino 给Python 编译器发送信息
-
1首先Python需要安装Pyserial库,在命令提示符中输入pipintallpyserial若是遇到提示‘pip‘不是内部或外部命令,也不是可运行的程序或批处理文件,则需要设置环境变...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- skip-name-resolve (63)
- linuxlink (65)
- pythonwget (67)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)