Maui Blazor 中文社区 QQ群:645660665

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

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

动图

源码

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

posted @ 2023-03-21 00:12  AlexChow  阅读(873)  评论(2编辑  收藏  举报