写在前面
FreeSql 一个款 .net 平台下支持 .net framework 4.5+、.net core 2.1+ 的开源 ORM。单元测试超过3100+,正在不断吸引新的开发者,生命不息开发不止。
和 EFCore 一样,我们也有导航对象,支持【OneToOne】(一对一)、【ManyToOne】(多对一)、【OneToMany】(一对多)、【ParentChild】(父子)、【ManyToMany】(多对多),可以约定配置或手工配置实体间的关联,也可以使用 fluent api 设置关联。
联级保存功能可实现保存对象的时候,将其【OneToMany】、【ManyToMany】导航属性集合也一并保存,本文档说明实现的机制防止误用。
机制规则
【一对多】模型下, 保存时可联级保存实体的属性集合。出于使用安全考虑我们没做完整对比,只实现实体属性集合的添加或更新操作,所以不会删除实体属性集合的数据。
完整对比的功能使用起来太危险,试想下面的场景:
- 保存的时候,实体的属性集合是空的,如何操作?记录全部删除?
- 保存的时候,由于数据库中记录非常之多,那么只想保存子表的部分数据,或者只需要添加,如何操作?
【多对多】模型下,我们对中间表的保存是完整对比操作,对外部实体的操作只作新增(注意不会更新)
- 属性集合为空时,删除他们的所有关联数据(中间表)
- 属性集合不为空时,与数据库存在的关联数据(中间表)完整对比,计算出应该删除和添加的记录
功能开启和关闭
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, "Data Source=|DataDirectory|/document22.db;Pooling=true;Max Pool Size=10")
.UseAutoSyncStructure(true) //自动同步结构到数据库
.UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) //监听SQL命令对象,在执行后
.Build();
使用 FreeSqlBuilder 创建好的 IFreeSql 对象,联级保存功能,默认是打开的。
全局关闭:
fsql.SetDbContextOptions(opt => opt.EnableAddOrUpdateNavigateList = false);
局部关闭:
var repo = fsql.GetRepository<T>();
repo.DbContextOptions.EnableAddOrUpdateNavigateList = false;
一对多(OneToMany)代码测试
为了方便展示,以下是一个 ParentChild 关系,其实他也是 OneToMany,只不过是自己指向自己。
[Table(Name = "EAUNL_OTMP_CT")]
class CagetoryParent
{
public Guid Id {
get; set; }
public string Name {
get; set; }
public Guid ParentId {
get; set; }
[Navigate("ParentId")]
public List<CagetoryParent> Childs {
get; set; }
}
初始化测试数据:
var cts = new[] {
new CagetoryParent
{
Name = "分类1",
Childs = new List<CagetoryParent>(new[]
{
new CagetoryParent {
Name = "分类1_1" },
new CagetoryParent {
Name = "分类1_2" },
new CagetoryParent {
Name = "分类1_3" }
})
},
new CagetoryParent
{
Name = "分类2",
Childs = new List<CagetoryParent>(new[]
{
new CagetoryParent {
Name = "分类2_1" },
new CagetoryParent {
Name = "分类2_2" }
})
}
};
1、执行批量插入:
var repo = g.sqlite.GetRepository<CagetoryParent>();
repo.Insert

FreeSql 是一个强大的 .NET ORM,支持 .NET Framework 和 .NET Core。本文详细介绍了 FreeSql 的导航属性功能,包括一对多(OneToMany)、多对多(ManyToMany)的联级保存机制,以及如何开启和关闭该功能。在一对多关系中,FreeSql 不会执行完整的对比,仅进行添加或更新操作。而在多对多关系中,中间表会进行完整对比,确保数据同步。此外,文章还展示了各种操作的代码示例,帮助开发者更好地理解和使用 FreeSql 的导航属性功能。
最低0.47元/天 解锁文章
1537

被折叠的 条评论
为什么被折叠?



