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
关联项目
FreeSql QQ群:4336577
BA & Blazor QQ群:795206915
Maui Blazor 中文社区 QQ群:645660665
知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名AlexChow(包含链接: https://github.com/densen2014 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系 。
转载声明
本文来自博客园,作者:周创琳 AlexChow,转载请注明原文链接:https://www.cnblogs.com/densen2014/p/17235044.html