OneToOne 垂直扩展表字段是很常见的方法, 主表存商品资料, 分表存每个客户对应商品的备注和个性化的价格等等, 本文使用Blazor一步步实现这个简单的需求.
1. 基于实战 10分钟编写数据库维护项目建立项目 b17tableII
2. 数据实体类
One To One 关系:
在这里 我们使用 [Navigate(nameof(SubCagetory3PK.Id))] 来导航, 在两个实体之间定义了一对一的关系,这里Cagetory3与SubCagetory3PK是一对一的关系。
///
/// OneToOne, 两边都用 pk 作为关联,才是绝对的1v1, 否则是 ManyToOne
///
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;
///
/// 垂直分表,扩展字段
///
[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();
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
@code {
// 由于使用了FreeSql ORM 数据服务,可以直接取对象
[Inject] IFreeSql? fsql { get; set; }
[Inject] ToastService? toastService { get; set; }
List IncludeByPropertyNames = new List {
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
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net