[ActiveRecord] 之六:继承

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南 本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。 阅读详情
ActiveRecord 支持继承体系,我们看看几种不同的实现方式。

1. 无关联继承
public class Person
{
  private int id;

  [PrimaryKey(PrimaryKeyType.Identity)]
  public int Id
  {
    get { return id; }
    set { id = value; }
  }

  private string name;

  [Property(NotNull=true)]
  public string Name
  {
    get { return name; }
    set { name = value; }
  }
}

[ActiveRecord]
public class Student : Person
{
  private int grade;

  [Property]
  public int Grade
  {
    get { return grade; }
    set { grade = value; }
  }
}

[ActiveRecord]
public class Teacher : Person
{
  private string job;

  [Property]
  public string Job
  {
    get { return job; }
    set { job = value; }
  }
}

调用 ActiveRecordStarter.CreateSchema(); ,你会发现数据库里面分别生成了 Student 和 Teacher 数据表,每个表都拥有基类(Person)的字段,相互没有关联。这种继承方式下,我们无法通过 Find(typeof(Person)) 来返回所有人(Student & Teacher)。严格来说,我们根本无法调用此方法,因为我们不能为 Person 添加 ActiveRecordAttribute。

此方式仅仅是为了代码重用而已,并没有业务上的关联。

== 数据表结构 ==
Student Table
{
  Id
  Name
  Grade
}

Teacher Table
{
  Id
  Name
  Job
}

执行插入对象测试代码
Student s = new Student();
s.Name = "student1";
s.Grade = 2;
ActiveRecordMediator.Create(s);

Teacher t = new Teacher();
t.Name = "teacher1";
t.Job = "班主任";
ActiveRecordMediator.Create(t);

结果
Student Table
{
  Id = 1
  Name = "student1"
  Grade = 2
}

Teacher Table
{
  Id = 1
  Name = "teacher1"
  Job = "班主任"
}

2. 单表关联继承

我们使用 ActiveRecordAttribute 内置属性更改上面的例子,使其成为关联继承。
[ActiveRecord(DiscriminatorColumn = "Type", DiscriminatorType = "String", DiscriminatorValue = "Person")]
public class Person
{
  private int id;

  [PrimaryKey(PrimaryKeyType.Identity)]
  public int Id
  {
    get { return id; }
    set { id = value; }
  }

  private string name;

  [Property(NotNull=true)]
  public string Name
  {
    get { return name; }
    set { name = value; }
  }
}

[ActiveRecord(DiscriminatorValue = "Student")]
public class Student : Person
{
  private int grade;

  [Property]
  public int Grade
  {
    get { return grade; }
    set { grade = value; }
  }
}

[ActiveRecord(DiscriminatorValue = "Teacher")]
public class Teacher : Person
{
  private string grade;

  [Property]
  public string Job
  {
    get { return grade; }
    set { grade = value; }
  }
}

你会发现数据库里面仅生成了一个Person表。

== 数据表结构 ==
Student Person
{
  Id
  Type // 由 Person[DiscriminatorColumn...] 特性生成!
  Name
  Grade
  Job
}

执行插入对象测试代码
结果
Person Table
{
  // Record 1-----------------
  Id = 1
  Type = "Student"
  Name = "student1"
  Grade = 2
  Job = <NULL>

  // Record 2-----------------
  Id = 2
  Type = "Teacher"
  Name = "teacher1"
  Grade = <NULL>
  Job = "办主任"
}

在基类定义一个 DiscriminatorColumn 特性,子类通过写入不同的 DiscriminatorValue 来达到区分不同子类型的目的。

这种方式解决了多态查询的问题,但当子类新增属性较多,而且多个子类属性差别较大的情况下,数据库空间浪费会比较严重。同时由于对于不属于当前类的数据库字段插入NULL,可能会造成插入时发生错误,触发异常(比如我们将 Teacher.Job 的特性改为 Property(NotNull=true),那么我们保存Student对象到数据库时就会触发异常)。

我们对基类和子类进行查询测试
foreach Person p in (Person[])ActiveRecordMediator.FindAll(typeof(Person)))
{
  Console.WriteLine("Person {0}:{1}", p.Id, p.Name);
}

foreach (Student p2 in (Student[])ActiveRecordMediator.FindAll(typeof(Student)))
{
  Console.WriteLine("Student {0}:{1}", p2.Id, p2.Name);
}

foreach (Teacher p3 in (Teacher[])ActiveRecordMediator.FindAll(typeof(Teacher)))
{
  Console.WriteLine("Teacher {0}:{1}", p3.Id, p3.Name);
}

输出
Person 1:student1
Person 2:teacher1
Student 1:student1
Teacher 2:teacher1

建议你继续往下看,或许下面的方式更适合你。

3. 多表关联继承
[ActiveRecord, JoinedBase]
public class Person
{
  private int id;

  [PrimaryKey(PrimaryKeyType.Identity)]
  public int Id
  {
    get { return id; }
    set { id = value; }
  }

  private string name;

  [Property(NotNull=true)]
  public string Name
  {
    get { return name; }
    set { name = value; }
  }
}

[ActiveRecord]
public class Student : Person
{
  [JoinedKey("Id")]
  public int StudentId
  {
    get { return base.Id; }
    set { base.Id= value; }
  }
    
  private int grade;

  [Property]
  public int Grade
  {
    get { return grade; }
    set { grade = value; }
  }
}

[ActiveRecord]
public class Teacher : Person
{
  [JoinedKey("Id")]
  public int TeacherId
  {
    get { return base.Id; }
    set { base.Id= value; }
  }
    
  private string grade;

  [Property]
  public string Job
  {
    get { return grade; }
    set { grade = value; }
  }
}

我们注意到为 Person 添加了 ActiveRecordAttribute 和 JoinedBaseAttribute 特性,同时为子类 Student 和 Teacher 添加了一个附加了 JoinedKeyAttribute 的 Id 字段。此继承模式会分别生成 Person、Student 和 Teacher 三个数据表。Person 存储了基类的所有字段,子类表仅包含子类增加的属性和Id映射字段。此继承方式下,我们查找 Person 时,会同时返回 Student 和 Teacher记录。

== 数据表结构 ==
Person Table
{
  Id
  Name
}

Student Table
{
  StudentId
  Grade
}

Teacher Table
{
  TeacherId
  Job
}

执行插入对象测试代码
结果
Person Table
{
  // Record 1---
  Id = 1
  Name = "student1"

  // Record 1---
  Id = 2
  Name = "teacher1"
}

Student Table
{
  Id = 1
  Grade = 2
}

Teacher Table
{
  Id = 2
  Job = "班主任"
}

-----------------

附:本文所有演示代码使用 2006-01-01 发布的 Castle ActiveRecord Beta3 版本。
Castle ActiveRecord 在发布 1.0 版本前可能有很多较大的变化,如演示代码无法编译,建议您参考最新版本的相关文档。  
【IC前端虚拟项目】spyglass lint环境组织与lint清理 和上个虚拟项目的lint清理环节一样,关于spyglass的lint清理功能与流程还是大家通过各种资料去学习下就好啦。和之前不同的事,这次的虚拟项目里我把流程封装为Makefile,更加的贴近了实际项目交付流程。而后就可以根据提示进行lint的清理工作了。 阅读详情

相关推荐

ubuntu 20.04系统离线安装nfs

ubuntu环境下,离线安装nfs

m0_62464865的博客 2244

在分表的情况下,ActiveRecord如何支持继承?

想实现如下的效果:Horse/Pig/Sheep均继承Animal,拥有共同的属性和关联。 class Animal

together 194

从零构建OpenBMC风扇控制:基于phosphor-pid-control的实战配置指南

本文详细介绍了如何从零开始构建OpenBMC风扇控制系统,基于phosphor-pid-control框架实现风扇自动调速。通过解析PID算法配置、传感器定义及控制区域设置,提供工业级散热解决方案,帮助开发者优化服务器能效与可靠性。

weixin_29263201的博客 749

1.NetDh框架之数据库操作层--Dapper简单封装,可支持多库实例、多种数据库类型等(附源码和示例代码)...

1.NetDh框架开始的需求场景 需求场景: 1.之前公司有不同.net项目组,有的项目是用SqlServer做数据库,有的项目是用Oracle,后面也有可能会用到Mysql等,而且要考虑后续扩展成主从库、多库的需求。(其实不管有没有这个需求,Dapper的封装应当像NetDb框架里封装的那样使用); 2.涉及日志操作类的设计,需要记录用户操作日志、记录...

weixin_34161032的博客 925

GD32单片机引脚复用指南:如何让JTAG接口的PA15/PB3发挥第二功能?

本文详细介绍了GD32F103Cx系列单片机如何通过AFIO模块进行引脚复用,特别是将默认用于JTAG调试接口的PA15、PB3等引脚释放为普通IO或复用功能引脚。文章从原理出发,结合代码实践,讲解了如何配置调试端口重映射,将JTAG引脚安全地转换为GPIO或定时器通道,并提供了常见问题排查与最佳实践,帮助开发者高效利用有限的引脚资源。

nept的博客 810

【UE5】三步搞定Pixel Streaming:从零搭建Windows像素流服务

本文详细介绍了如何在Windows平台上快速搭建UE5 Pixel Streaming像素流服务,从插件安装、项目打包到服务启动的全流程操作。通过实战案例和优化配置,帮助开发者实现零客户端配置、跨设备兼容的高性能3D应用流式传输,特别适合建筑可视化和实时协作场景。

weixin_29000991的博客 318

ActiveRecord学习笔记(五):处理继承关系

  本文主要介绍了如何使用Castle.ActiveRecord来处理继承关系。  本文涉及两个实体类:基类(User)、子类(Employee)。以下是类图:本文主要内容:1.编写数据库脚本2.JoinedBase和JoinedKey属性说明3.编写实体类4.编写调用代码一、编写数据库脚本  其实本文涉及的数据表在前面的笔记中都出现过! Create Table Users(  ID int ...

weixin_34067980的博客 145

Deeplabv3+改进1:添加CBAM注意力机制|有效涨点

我们提出卷积块注意力模块(CBAM),这是一种简单而有效的前馈卷积神经网络注意力模块。给定一个中间特征图,我们的模块会依次沿两个独立维度(通道和空间)推断注意力图,然后将注意力图与输入特征图相乘,以实现自适应特征细化。由于 CBAM 是一个轻量级且通用的模块,它可以无缝集成到任何 CNN 架构中,几乎不会增加开销,并且可以与基础 CNN 一起端到端训练。我们通过在 ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上进行的大量实验验证了 CBAM。

AIcurator的博客 1691

继承ActiveRecord的模型类 添加自定义属性

一、你在前期开发过程中,如果继承ActiveRecord的话,你应该是通过gii自动生成代码的 但是你在开发中,由于业务逻辑的一致改变,有可能会在之前的数据库中加一些字段 那么现在就需要注意了 二、你想将刚刚加入的字段也运用在代码中---很简单 跟我来 1.首先在数据库中加入你的字段(以oracle为例) 2.模型的操作 2.1 rules规则中加入字段 2.2 attrib

林子懿0509 1704

滑模观测器与锁相环结合应用:让电机“无感”也能精准旋转的奥秘

本文介绍了永磁同步电机无传感器控制中的滑模观测器(SMO)结合锁相环(PLL)技术。SMO通过创建虚拟电机模型,利用电流误差产生控制信号来估计反电动势;PLL则从反电动势中解码转子位置和速度信息。该组合方案兼具SMO的鲁棒性和PLL的高精度,计算量小且硬件要求低。文章详细阐述了原理、数学模型、参数整定方法及实际实现技巧,包括离散化处理、符号函数替代等优化手段,并分析了低速性能限制、抖振问题等常见挑战及解决方案。最后指出该技术未来将与人工智能、多观测器融合等方向结合发展。

汽车软件开发 195

【个人成长笔记】在Ubuntu中安装RTL8188GU USB无线网卡驱动(Driver for Linux RTL8188GU)

这篇笔记提供了在Ubuntu系统中安装RTL8188GU无线网卡驱动的完整指南。主要内容包括:驱动程序的官方来源(Github链接)、详细安装步骤(通过git下载、编译安装等命令),以及将设备转换为USB网卡模式的关键指令。特别提醒每次开机都需要执行模式转换命令,因为设备默认会以U盘模式启动。文章以简洁的技术文档形式呈现,适合Linux用户快速查阅和操作。

yuhuasheng1997的博客 1827

JS生成随机字符串的方法

JS生成随机字符串的方法 奇妙的写法 Math.random().toString(36).substr(2); //"2jdz2ecva7k" Math.random().toString(36).substr(2); //"tnn3ygzrky" 很有意思,研究了一下,基本上toString后的参数规定可以是2-36之间的任意整数,不写的话默认是10(也就是十进制),此时返回的值就是那个随机数。若是偶数,返回的数值字符串都是短的,若是奇数,则返回的将是一个很大长度的表示值。若&lt..

hjiaqing的博客 4534

移花接木,玩转CANoe的几种扩展接口应用(五)——串口设备

近期看到粉丝朋友在CANoe自动化测试方面的关注度很大,今天就围绕这个做一个专题,总结一下以往项目上用过的几种CANoe扩展接口,分享出来希望对相关领域的网友有所帮助。本文是该专题的第五篇文章,主要讲解了串口设备的功能配置、连接方法、配置方法、调用方法,最后分析了这种扩展借口应用的特点和适用场景。

Mr.Cssust的博客 2369

JS生成随机字符串的多种方法

JS生成随机字符串的多种方法 <script language="javascript"> function randomString(len) {   len = len || 32;   var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,...

XiaoPeng 5625

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

javascript生成指定位数的随机字符串

使用javascript生成指定位数的随机字符串 思路: 1、声明英文大小写字母和数字组成的字符串chars 2、根据指定长度进行循环遍历,随机生成不大于chars字符串长度的值,chars 根据该数值使用charAt获取该为字符 3、返回指定位数的字符串 实现代码: /* *生成指定位数的随机字符串 *len: 给定随机字符串长度 */ function randomString(len){ ...

linziping的博客 5074

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

html 随机字母,Js生成随机数 生成随机字符串的5种方法

第一种:使用randomString,e表示长度,默认32位function randomString(e) {e = e || 32;var t = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678",a = t.length,n = "";for (i = 0; i < e; i++) n += t.charAt(Math.floor(M...

weixin_42353715的博客 1304

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

原生js生成随机字符串

这简直不要太容易,直接上代码,代码里面有详细的注释,相信大家是可以看懂的----你们聪明如我 <!DOCTYPE html> <html lang="zh-CN"> <head> <title>js生成随机字符串</title> <head> <body> <p id="random-str">&...

薛定谔的猫-前端领域 647

JavaScript生成的随机数随机字符串JS生成的随机数随机字符串

JavaScript生成的随机数随机字符串JS生成的随机数随机字符串

风水道人 424

在JavaScript中生成随机字符串/字符

我想要一个由从[a-zA-Z0-9]随机挑选的字符组成的5个字符串。 用JavaScript做到这一点的最佳方法是什么?

asdfgh0077的博客 5811

JS - 随机生成32位随机字符串

js随机生成32位随机字符串 // 随机字符串方法 function randomString() { let len = 32; let $chars ='ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; let maxPos = $chars.length; let character = ''; for (let i = 0; i < len; i++) { character += $c

技术共享,共同进步! 2867

js怎么生成验证码?js生成指定长度的随机字符串

在项目中经常有生成随机字符串的需求,比如验证接口签名、验证码(Node.js发送短信或邮箱验证码、生成图片验证码),我们可以使用Javascript生成随机字符。

前端江湖 585

js生成随机字符串功能

// 获取长度为len的随机字符串 function _getRandomString(len) { len = len || 32; var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; // 默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1 var maxPos = $chars.le

香巴拉 1780

js生成随机字符串

Math.random().toString(36).substr(2)

qq_36800820的博客 197

JavaScript生成随机字母数字字符串

如何使用javascript生成随机字母数字字符串?下面本篇文章就来给大家介绍一下使用JavaScript生成随机字母数字字符串的方法,希望对大家有所帮助。 方法一:Math.random()方法和Math.floor()方法 ● 创建一个函数,该函数有两个参数,一个参数是我们想要生成的字符串的长度,另一个参数是我们想要在字符串中显示的字符。 ● 声明新变量ans = ' '。 ● 使用for循环以相反的顺序遍历字符串。 ● 使用JavaScript的Math.random()方法生成随.

qq_43067585的博客 2812

Javascript随机生成数字字母字符串

方法一:Math.random()方法和Math.floor()方法 创建一个函数,该函数有两个参数,一个参数是我们想要生成的字符串的长度,另一个参数是我们想要在字符串中显示的字符。 声明新变量ans = ’ '。 使用for循环以相反的顺序遍历字符串 使用JavaScript的Math.random()方法生成随机字符串 使用JavaScript的Math.floor()方法将其四舍五入并添加到...

渔夫 2083

JavaScript生成指定长度的随机字符串

JavaScript生成指定长度的随机字符串 在前端开发过程中,我们时常会遇到一些特定的场景需要我们生成随机字符串,以下就提供一种简单的实现方式: function generateRamStr(len, charSet) { const chars = charSet || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; let randomStr = ""; for (var i = 0; i < le

澜冰的博客 2958
上一篇: [ActiveRecord] 之五:ActiveRecordMediator
下一篇: Castle.Windsor 类型和对象构造参数注入
fjp813
博客等级 码龄23年 4粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值