OneToOne 垂直扩展表字段是很常见的方法, 主表存商品资料, 分表存每个客户对应商品的备注和个性化的价格等等, 本文使用Blazor一步步实现这个简单的需求.

1. 基于实战 10分钟编写数据库维护项目建立项目 b17tableII

2. 数据实体类

One To One 关系:

在这里 我们使用 [Navigate(nameof(SubCagetory3PK.Id))] 来导航, 在两个实体之间定义了一对一的关系,这里Cagetory3与SubCagetory3PK是一对一的关系。

/// <summary>
/// OneToOne, 两边都用 pk 作为关联,才是绝对的1v1, 否则是 ManyToOne
/// </summary>
class Cagetory3
{
public Guid Id { get; set; } public string? Name { get; set; } [Column(IsIgnore = true)]
public string SubName
{
get => subName ?? (Ext?.Remark ?? "");
set
{
subName = value;
Ext = Ext ?? new SubCagetory3PK() { Id = Id };
Ext!.Remark = value;
}
}
string? subName; /// <summary>
/// 垂直分表,扩展字段
/// </summary>
[Navigate(nameof(SubCagetory3PK.Id))]
public SubCagetory3PK? Ext { get; set; }
} class SubCagetory3PK
{
[Column(IsPrimary = true)]
public Guid Id { get; set; } public virtual Cagetory3? Cagetory { get; set; } public string? Remark { get; set; } }

3. 下面我们来建立初始示例数据

子表的Id一定要跟主表Id一致,才是OneToOne

    public static void GenDemoDatas(IFreeSql fsql)
{
var repo = fsql.GetRepository<Cagetory3>();
if (repo.Select.Any()) return;
repo.DbContextOptions.EnableCascadeSave = true; //OneToOne 关键点
var uid = Guid.NewGuid();
var uid2 = Guid.NewGuid();
var cts = new[]
{
new Cagetory3
{
Id=uid, //OneToOne 关键点
Name = "oto分类1",
Ext = new SubCagetory3PK {Id=uid, Remark = "扩展备注1" }
} ,
new Cagetory3
{
Id=uid2, //OneToOne 关键点
Name = "oto分类2",
Ext = new SubCagetory3PK {Id=uid2, Remark = "扩展备注2" }
} ,
};
repo.Insert(cts); }

4. 下一步我们需要注入带全功能的 FreeSqlDataService 数据服务:

在 Program.cs 添加以下语句:

builder.Services.AddSingleton(typeof(FreeSqlDataService<>));

5. 建立测试页面

新建文件FetchDataCagetory3.razor

<TablePollo TItem="Cagetory3"
IncludeByPropertyNames="@IncludeByPropertyNames"
ItemDetails="NullClass"
ItemDetailsII="NullClass"
EnableCascadeSave /> @code { // 由于使用了FreeSql ORM 数据服务,可以直接取对象
[Inject] IFreeSql? fsql { get; set; }
[Inject] ToastService? toastService { get; set; } List<string> IncludeByPropertyNames = new List<string> {
nameof(Cagetory3.Ext) ,
}; protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
Cagetory3.GenDemoDatas(fsql!);
}
} }

6. 运行

我们运行程序的时候,我们可以看到:数据库中已经自动创建了两张表了:

动图

源码

https://github.com/densen2014/Blazor100/tree/master/b17tableII

https://gitee.com/densen2014/Blazor100/tree/master/b17tableII

参考资料

FreeSql (十八)导航属性 https://www.cnblogs.com/FreeSql/p/11531352.html

多表查询 https://github.com/dotnetcore/FreeSql/wiki/多表查询

联级保存 https://github.com/dotnetcore/FreeSql/wiki/联级保存

BootstrapBlazor的FreeSql数据注入服务扩展包 https://github.com/densen2014/Densen.Freesql

BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 - OneToOne的更多相关文章

  1. [js开源组件开发]table表格组件

    table表格组件 表格的渲染组件,demo请点击http://lovewebgames.com/jsmodule/table.html,git源码请点击https://github.com/tian ...

  2. 使用 iview Table 表格组件修改操作的显示隐藏

    使用 iview Table 表格组件修改操作的显示隐藏,如下图 1.如何设置 table 操作按后台传入的状态值去渲染 不同的按钮? 解决方法 我们在vue2中,动态渲染html 使用的是 retu ...

  3. 封装Vue Element的table表格组件

    上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...

  4. 封装Vue Element的可编辑table表格组件

    前一段时间,有博友在我那篇封装Vue Element的table表格组件的博文下边留言说有没有那种"表格行内编辑"的封装组件,我当时说我没有封装过这样的组件,因为一直以来在实际开发 ...

  5. Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件

    封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...

  6. Vue3学习(十一)之 table表格组件的使用

    一.前言 大约有两周没学习更文,不是懒,而是没心情,相亲路屡战屡败,着实很影响心情. 我想这世上对我而言,最难的事,莫过于恋爱结婚了,再一次经历了见光死的高光时刻. 二.又见Ant Design Vu ...

  7. 表格组件神器:bootstrap table详细使用指南

    1.bootstrap-table简介 1.1.bootstrap table简介及特征: Bootstrap table是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单 ...

  8. ElementUI的Table表格添加自定义头CheckBox多选框

    在ElmentUI的Table表格组件中,也许你会使用type为selection值的多选框功能,但是此时设置的label属性不生效,不能设置标题名称:有时候我们的需求就是要添加标题名称,那该如何处理 ...

  9. 封装Vue纵向表头左右结构的table表格

    我们前端开发人员在使用表格的过程中,大概率碰到的都是表格头部在表格的最上边,然后呈一行展示,紧接着就是表格的每一行的每一个单元格来展示具体内容的场景,很少会遇到表格的头部呈纵向一行展示,也就是说表格的 ...

  10. 【转载】BootStrap表格组件bootstrap table详解

    (转载,来源“脚本之家”,作者不详) 一.Bootstrap Table的引入 关于Bootstrap Table的引入,一般来说还是两种方法: 1.直接下载源码,添加到项目里面来.由于Bootstr ...

随机推荐

  1. MFC工程调用cJSON.c出现C1853错误的解决办法(老版本C文件加入新的C++项目)

    环境 Visual Studio 2017 现象 头文件cJSON.h与源文件cJSON.c添加入工程后,编译出现如下C1853错误. cjson.c : fatal error C1853: &qu ...

  2. 简单a+b

    1 # include <stdio.h> 2 3 /*输入两个整数a和b,计算a+b的和 4 注意此题是多组测试数据 */ 5 6 // 我的解法 7 void main(){ 8 in ...

  3. 【七侠传】冲刺阶段--Day7

    [七侠传]冲刺阶段--Day7 团队成员 20181221曾宇涛 20181202李祎铭 20181209沙桐 20181215薛胜瀚 20181216杨越麒 20181223何家豪 20181232 ...

  4. Idea 配置 tomacat

    步骤 1.点击settings 2.创建tomcat 并找到tomcat的目录 添加完成 3.创建Idea项目

  5. WinCC插件制作教程

    目录 插件的编写 插件的使用 参考资料 Creation of .NET Controls 109759944_Prepare.NetControls_DOC_en.pdf 插件的编写 创建插件项目, ...

  6. 执行Maven的test命令报错

    参考网址:https://blog.csdn.net/weixin_46688566/article/details/126470742 解决方案 在pom.xml文件中加入以下依赖: <plu ...

  7. EF OwnsOne 主键不自增

    menu public class Menu { /// <summary> /// id /// </summary> [Key, DatabaseGeneratedAttr ...

  8. ubuntu14搭建内网gitlab服务器

    平台 宿主机系统版本:Ubuntu 14.04.5 LTS gitlab软件版本:11.10.8-ee 验证web浏览器版本:Mozilla Firefox 68.3.0esr 安装firefox浏览 ...

  9. 十大经典排序之希尔排序(C++实现)

    希尔排序 思路: 1.选择一个增量序列 t1,t2,--,tk,其中 ti > tj, tk = 1(最后必须是1) 2.按增量序列个数 k,对序列进行 k 趟排序 代码实现: #include ...

  10. install package within python

    import os os.system("pip install numpy") import subprocess subprocess.call(['pip3', 'insta ...