经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Bootstrap » 查看文章
BootstrapBlazor + FreeSql ORM 实战 Table 表格组件维护多表数据 - OneToOne
来源:cnblogs  作者:AlexChow  时间:2023/3/22 9:28:40  对本文有异议

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

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

2. 数据实体类

One To One 关系:

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

  1. /// <summary>
  2. /// OneToOne, 两边都用 pk 作为关联,才是绝对的1v1, 否则是 ManyToOne
  3. /// </summary>
  4. class Cagetory3
  5. {
  6. public Guid Id { get; set; }
  7. public string? Name { get; set; }
  8. [Column(IsIgnore = true)]
  9. public string SubName
  10. {
  11. get => subName ?? (Ext?.Remark ?? "");
  12. set
  13. {
  14. subName = value;
  15. Ext = Ext ?? new SubCagetory3PK() { Id = Id };
  16. Ext!.Remark = value;
  17. }
  18. }
  19. string? subName;
  20. /// <summary>
  21. /// 垂直分表,扩展字段
  22. /// </summary>
  23. [Navigate(nameof(SubCagetory3PK.Id))]
  24. public SubCagetory3PK? Ext { get; set; }
  25. }
  26. class SubCagetory3PK
  27. {
  28. [Column(IsPrimary = true)]
  29. public Guid Id { get; set; }
  30. public virtual Cagetory3? Cagetory { get; set; }
  31. public string? Remark { get; set; }
  32. }

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

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

  1. public static void GenDemoDatas(IFreeSql fsql)
  2. {
  3. var repo = fsql.GetRepository<Cagetory3>();
  4. if (repo.Select.Any()) return;
  5. repo.DbContextOptions.EnableCascadeSave = true;
  6. //OneToOne 关键点
  7. var uid = Guid.NewGuid();
  8. var uid2 = Guid.NewGuid();
  9. var cts = new[]
  10. {
  11. new Cagetory3
  12. {
  13. Id=uid, //OneToOne 关键点
  14. Name = "oto分类1",
  15. Ext = new SubCagetory3PK {Id=uid, Remark = "扩展备注1" }
  16. } ,
  17. new Cagetory3
  18. {
  19. Id=uid2, //OneToOne 关键点
  20. Name = "oto分类2",
  21. Ext = new SubCagetory3PK {Id=uid2, Remark = "扩展备注2" }
  22. } ,
  23. };
  24. repo.Insert(cts);
  25. }

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

在 Program.cs 添加以下语句:

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

5. 建立测试页面

新建文件FetchDataCagetory3.razor

  1. <TablePollo TItem="Cagetory3"
  2. IncludeByPropertyNames="@IncludeByPropertyNames"
  3. ItemDetails="NullClass"
  4. ItemDetailsII="NullClass"
  5. EnableCascadeSave />
  6. @code {
  7. // 由于使用了FreeSql ORM 数据服务,可以直接取对象
  8. [Inject] IFreeSql? fsql { get; set; }
  9. [Inject] ToastService? toastService { get; set; }
  10. List<string> IncludeByPropertyNames = new List<string> {
  11. nameof(Cagetory3.Ext) ,
  12. };
  13. protected override async Task OnAfterRenderAsync(bool firstRender)
  14. {
  15. if (firstRender)
  16. {
  17. Cagetory3.GenDemoDatas(fsql!);
  18. }
  19. }
  20. }

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

原文链接:https://www.cnblogs.com/densen2014/p/17235044.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号