gpt4 book ai didi

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

转载 作者:我是一只小鸟 更新时间:2023-03-21 06:31:06 28 4
gpt4 key购买 nike

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+FreeSqlORM实战Table表格组件维护多表数据-OneToOne的文章就讲到这里了,如果你想了解更多关于BootstrapBlazor+FreeSqlORM实战Table表格组件维护多表数据-OneToOne的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0