首页 > 数据库 >sqlite 触发器 c#

sqlite 触发器 c#

时间:2023-09-03 16:33:42浏览次数:31  
标签:sqlite c# 数据库 触发器 UPDATE UpdatedDate Villas SQLite

sqlite触发器

我看到你在使用 Entity Framework Core 和 SQLite 数据库,想让别墅实体的 UpdatedDate 属性在更新时自动生成。这是一个使用 Code First 的问题,关于如何配置实体属性的值生成策略(Value Generation Strategy)。要实现这个功能,你需要遵循以下步骤:

属性注释

  • 使用 [DatabaseGenerated] 特性:你需要在 UpdatedDate 属性上添加 [DatabaseGenerated] 特性,并指定参数为 DatabaseGeneratedOption.Computed,表示这个属性的值由数据库在每次插入或更新时自动计算。例如:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime UpdatedDate { get; set; }

配置数据库默认值

  • 配置数据库默认值:你需要在 OnModelCreating 方法中,使用 HasDefaultValueSql 方法来配置数据库为 UpdatedDate 属性生成的默认值,通常是当前的日期时间。例如:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Villa>()
        .Property(v => v.UpdatedDate)
        .HasDefaultValueSql("CURRENT_TIMESTAMP");
}

设置触发器

  • 使用触发器(Trigger):由于 SQLite 不支持计算列(Computed Column),你需要在数据库中创建一个触发器,用来在每次更新别墅表时,将 UpdatedDate 属性的值设置为当前的日期时间。例如:
CREATE TRIGGER Update_UpdatedDate
AFTER UPDATE ON Villas
BEGIN
    UPDATE Villas SET UpdatedDate = CURRENT_TIMESTAMP WHERE Id = NEW.Id;
END;

如何查看sqlite的触发器

  • 使用 SELECT 语句:你可以在 SQLite 命令行中输入 SELECT * FROM sqlite_master WHERE type = 'trigger'; 命令,来查询数据库中所有的触发器的信息,包括名称、表名、时机、事件等。如果你看到你创建的触发器的信息,说明触发器已经创建成功了。

  • 使用 PRAGMA 语句:你可以在 SQLite 命令行中输入 PRAGMA table_info(Villas); 命令,来查询别墅表的信息,包括列名、类型、默认值等。如果你看到 UpdatedDate 列的默认值是 CURRENT_TIMESTAMP,说明触发器已经创建成功了。

  • 使用 UPDATE 语句:你可以在 SQLite 命令行中输入 UPDATE Villas SET Name = 'New Name' WHERE Id = 1; 命令,来更新别墅表中的一行数据,并修改名称为 'New Name'。然后,你可以输入 SELECT * FROM Villas WHERE Id = 1; 命令,来查询更新后的数据。如果你看到 UpdatedDate 列的值变成了当前的日期时间,说明触发器已经创建成功了,并且生效了。

时区问题

  • 设置数据库的时间格式:你需要在 SQLite 命令行中输入 PRAGMA date_format = 'YYYY-MM-DD HH:MM:SS'; 命令,来设置数据库的时间格式为标准的 ISO 8601 格式,这样可以方便地转换时区。

  • 设置数据库的时间时区:你需要在 SQLite 命令行中输入 PRAGMA date_time_zone = 'localtime'; 命令,来设置数据库的时间时区为本地时区,这样可以根据你的系统设置来显示和存储时间。

  • 修改触发器的操作:你需要在 SQLite 命令行中输入 DROP TRIGGER Update_UpdatedDate; 命令,来删除之前创建的触发器。然后,你需要重新创建一个触发器,并修改操作中的 CURRENT_TIMESTAMPdatetime('now', 'localtime'),表示使用本地时区的当前时间。例如:

CREATE TRIGGER Update_UpdatedDate
AFTER UPDATE ON Villas
BEGIN
    UPDATE Villas SET UpdatedDate = datetime('now', 'localtime') WHERE Id = NEW.Id;
END;
;

标签:sqlite,c#,数据库,触发器,UPDATE,UpdatedDate,Villas,SQLite
From: https://www.cnblogs.com/zhuoss/p/17675139.html

相关文章

  • Lnton羚通智能分析算法道路病害识别监测系统,使用CNN网络深度学习算法
    道路病害识别监测系统通过CNN网络深度学习算法,道路病害识别监测对巡检车上实时监控道路影像数据进行分析,输出道路病害裂缝巡检报告并落图展示。卷积神经网络(ConvolutionalNeuralNetwork,CNN)在图像处理和图像识别任务中取得了很大的成功。它通过卷积层、池化层和全连接层的组......
  • Java:SpringBoot实现定时任务Scheduled
    代码示例packagecom.example.demo.config;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableScheduling;importorg.springframework.scheduling.annotation.Scheduled;importjava.text.SimpleDat......
  • 无涯教程-JavaScript - STDEV函数
    STDEV函数替代Excel2010中的STDEV.S函数。描述该函数根据样本估算标准偏差。标准偏差是对值与平均值(平均值)的分散程度的度量。语法STDEV(number1,[number2],...)争论Argument描述Required/OptionalNumber1Thefirstnumberargumentcorrespondingtoasampleo......
  • 【ceph运维】解决mon is allowing insecure global_id reclaim问题
    解决monisallowinginsecureglobal_idreclaim问题1.查询ceph状态:$ceph-scluster:id:37ac4cbb-a2c6-4f81-af1e-e9e39c010c85health:HEALTH_WARNmonisallowinginsecureglobal_idreclaimservices:mon:1daemons,quorumcep......
  • 【很难啊、拆分数、观察】P6944 [ICPC2018 WF] Gem Island
    简要题面:求\(n+d\)的\(n\)正整数拆分中,最大的\(r\)个数之和的期望。首先是典中典:KeyObservation:最后的形态\(a_1\toa_n\)的概率都是一样的。Proof:考虑组合数\(\binom{d}{a_1-1,a_2-1.....,a_n-1}\)。然后我们每次在每一个\(a_i-1\)每次分裂有......
  • C/C++ const关键字 解读
    Thecollocationbetweenconstandoriginalpointerisconfusedtomanypeople.Therearetwousagesofit.Thefirstoneisavariablepointerthatpointsaconstantdata.i.e.constint*p#include<iostream>intmain(){ inta=1,b=2; const......
  • leetcode226 翻转二叉树——简单
      #Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:definvertTree(self,root):......
  • Java反序列化:CommonsCollections6调试分析
    JDK8u71大版本中AnnotationInvocationHandler.readObject被修改了,为了使得CC1能够利用,又造了一条CC6CC6解决的是CC1在高版本jdk上无法利用的问题这里搬一下web佬Boogipop的整理图:环境搭建JDK测试版本:JDK11基础知识1.CC1和CC6的恶意代码执行触发链再来捋顺一下这条恶......
  • C语言-指针
    目录指针行指针多级指针void指针const修饰符指针前置概述:在计算机内存中最小的操作单元是字节Byte(不是位bit)。每一个字节单元,都有一个编号,称为地址。指针定义:专门用来存放地址的变量,称为指针变量,通称指针。格式:<存储类型><数据类型>*<指针变量名>inta=10;int*p......
  • C语言-函数
    函数基本用法举例:两数求和#include<stdio.h>intsum(int,int);//函数的声明,函数的原型intmain(intargc,charconst*argv[]){ intm=10; intn=20; ints; s=sum(m,n); printf("%d\n",s);}intsum(inta,intb){ intsum; sum=a+b; returns......