青海住房和城乡建设厅网站首页/seo技术员
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/%E5%A4%9A%E8%A1%A8%E6%9F%A5%E8%AF%A2
联级保存 https://github.com/dotnetcore/FreeSql/wiki/%E8%81%94%E7%BA%A7%E4%BF%9D%E5%AD%98
BootstrapBlazor的FreeSql数据注入服务扩展包 https://github.com/densen2014/Densen.Freesql