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