BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 – OneToOne

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. 运行

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

BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 - OneToOne

BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 - OneToOne

动图

BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 - OneToOne

源码

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

发表评论

相关文章

当前内容话题