终极指南:如何用FreeSql轻松搞定一对多、多对多导航属性关系

【免费下载链接】FreeSql .NET aot orm, VB.NET/C# orm, Mysql/PostgreSQL/SqlServer/Oracle orm, Sqlite/Firebird/Clickhouse/DuckDB orm, 达梦/金仓/虚谷/翰高/高斯 orm, 神通 orm, 南大通用 orm, 国产 orm, TDengine orm, QuestDB orm, MsAccess orm. 【免费下载链接】FreeSql 项目地址: https://gitcode.com/gh_mirrors/fr/FreeSql

FreeSql是一款功能强大的.NET ORM框架,支持多种数据库,包括Mysql、PostgreSQL、SqlServer、Oracle等,让开发者能够轻松处理实体间的关系映射。本文将详细介绍如何使用FreeSql的导航属性功能,轻松搞定一对多和多对多关系,让你的数据访问层代码更加简洁高效。

FreeSql导航属性概述

导航属性是FreeSql中用于表示实体间关系的重要特性,它允许你通过实体对象直接访问关联的其他实体,而无需手动编写复杂的JOIN查询。FreeSql支持多种关系类型,包括一对一、一对多和多对多,其中一对多和多对多是最常见的应用场景。

FreeSql架构图

FreeSql的导航属性功能主要通过NavigateAttribute特性和Fluent API两种方式进行配置,同时提供了灵活的查询方法来加载关联数据。

一对多关系配置与使用

一对多关系模型定义

一对多关系是指一个实体对象可以关联多个子实体对象。例如,一个博客可以有多个文章,一个订单可以包含多个订单项。在FreeSql中,你可以通过以下方式定义一对多关系:

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    [Navigate(nameof(Post.BlogId))]
    public List<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public int BlogId { get; set; }
    
    [Navigate(nameof(BlogId))]
    public Blog Blog { get; set; }
}

使用Fluent API配置一对多关系

除了使用特性,你还可以使用Fluent API来配置一对多关系:

fsql.CodeFirst
    .Entity<Blog>(eb =>
    {
        eb.HasMany(b => b.Posts).WithOne(p => p.Blog).HasForeignKey(p => p.BlogId);
    });

加载一对多关联数据

使用Include方法可以轻松加载一对多关联数据:

var blog = fsql.Select<Blog>()
    .Where(b => b.Id == 1)
    .Include(b => b.Posts)
    .First();

多对多关系配置与使用

多对多关系模型定义

多对多关系是指两个实体之间可以相互关联多个对象。例如,一篇文章可以有多个标签,一个标签也可以关联多篇文章。在FreeSql中,你需要定义一个中间表来存储多对多关系:

public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
    
    [Navigate(ManyToMany = typeof(ArticleTag))]
    public List<Tag> Tags { get; set; }
}

public class Tag
{
    public int Id { get; set; }
    public string Name { get; set; }
    
    [Navigate(ManyToMany = typeof(ArticleTag))]
    public List<Article> Articles { get; set; }
}

public class ArticleTag
{
    public int ArticleId { get; set; }
    public int TagId { get; set; }
}

加载多对多关联数据

使用IncludeMany方法可以加载多对多关联数据:

var articles = fsql.Select<Article>()
    .IncludeMany(a => a.Tags)
    .ToList();

高级导航属性查询

条件加载关联数据

你可以在IncludeIncludeMany方法中使用then参数来添加条件:

var blog = fsql.Select<Blog>()
    .Where(b => b.Id == 1)
    .Include(b => b.Posts, then => then.Where(p => p.Status == 1))
    .First();

多级导航属性加载

FreeSql支持多级导航属性加载,轻松处理复杂的关联关系:

var blog = fsql.Select<Blog>()
    .Include(b => b.Posts, then => then
        .Include(p => p.Comments))
    .First();

投影查询关联数据

你可以只选择关联数据中的部分字段,提高查询效率:

var blogs = fsql.Select<Blog>()
    .Include(b => b.Posts, then => then
        .Select(p => new { p.Id, p.Title }))
    .ToList();

总结

FreeSql的导航属性功能为处理实体间关系提供了简单而强大的解决方案。通过本文介绍的一对多和多对多关系配置及查询方法,你可以轻松应对各种复杂的数据关联场景。无论是简单的博客系统还是复杂的企业应用,FreeSql都能帮助你编写更加简洁、高效的数据访问代码。

如果你想深入了解FreeSql的更多功能,可以查看项目中的示例代码,如Examples/base_entity/Program.cs,其中包含了丰富的导航属性使用示例。开始使用FreeSql,让数据访问变得更加简单!

【免费下载链接】FreeSql .NET aot orm, VB.NET/C# orm, Mysql/PostgreSQL/SqlServer/Oracle orm, Sqlite/Firebird/Clickhouse/DuckDB orm, 达梦/金仓/虚谷/翰高/高斯 orm, 神通 orm, 南大通用 orm, 国产 orm, TDengine orm, QuestDB orm, MsAccess orm. 【免费下载链接】FreeSql 项目地址: https://gitcode.com/gh_mirrors/fr/FreeSql

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐