首页 > 数据库 >数据库设计 外键设计 关联表查询 linq efcore

数据库设计 外键设计 关联表查询 linq efcore

时间:2024-04-25 12:11:21浏览次数:11  
标签:set get request 外键 order linq efcore var public

数据库的设计

实体之间的关系图

实体

EleOrderRowItem.cs

public class EleOrderRowItem : EleEntity
{

    public string? Xxx { get; set; }

    // 外键:一个rowItem属于一个row 
    public long RowId { get; set; }
    public required EleOrderRow Row { get; set; }
}

EleOrderRow.cs

public class EleOrderRow : EleEntity
{

    public string? Xxx { get; set; }

    // 外键:一个Row属于一个request
    public long RequestId { get; set; }
    public required EleOrderRequest Request { get; set; }

    // 导航属性:一个row可以有多个rowItem
    public required ICollection<EleOrderRowItem> RowItems { get; set; }

}

EleOrderRequest.cs

public class EleOrderRequest : EleEntity
{

    public string? Xxx { get; set; }

    // 外键:一个request属于一个order
    public long OrderId { get; set; }
    public required EleOrder Order { get; set; }

    // 导航属性:一个request可以有多个row
    public required  ICollection<EleOrderRow> Rows { get; set; }

}



EleOrderHeader.cs

public class EleOrderHeader : EleEntity
{

    public string? Xxx { get; set; }

    // 外键:一个messageHeader属于一个order
    public long OrderId { get; set; }
    public required EleOrder Order { get; set; }

}

EleOrder.cs

public class EleOrder : EleEntity
{
    /// <summary>
    /// 导航属性:一个Order有一个MessageHeader
    /// </summary>
    [Required]
    public  EleOrderHeader MessageHeader { get; set; }

    /// <summary>
    /// 导航属性:一个Order可以有多个request
    /// </summary>
    [Required]
    public  ICollection<EleOrderRequest> Requests { get; set; }

}

外键配置

modelBuilder.Entity<EleOrder>(entity =>
{
    // order与header的关系,一对一
    entity.HasOne(d => d.MessageHeader).WithOne(u => u.Order).HasForeignKey<EleOrderHeader>(u => u.OrderId);

    // order与request的关系,一对多
    entity.HasMany(d => d.Requests).WithOne(u => u.Order).HasForeignKey(r => r.OrderId).OnDelete(DeleteBehavior.Cascade);

});

modelBuilder.Entity<EleOrderRequest>(entity =>
{
    // 一个eleorderrequest可以有多个elorderrow
    entity.HasMany(e => e.Rows).WithOne(r => r.Request).HasForeignKey(x => x.RequestId).OnDelete(DeleteBehavior.Cascade);
});

modelBuilder.Entity<EleOrderRow>(entity =>
{
    // 一个row可以有多个rowitem
    entity.HasMany(d => d.RowItems).WithOne(u => u.Row).HasForeignKey(x => x.RowId).OnDelete(DeleteBehavior.Cascade);
});

LINQ查询关联表

var orders = context.EleOrder
			.Include(x => x.MessageHeader)
			.Include(x => x.Requests)
				.ThenInclude(x => x.Rows)
					.ThenInclude(x => x.RowItems)
			.ToList();

手动查询

var orders = context.EleOrder.ToList();
foreach (var order in orders)
{
    // System.Console.WriteLine("--------------------");
    // Console.WriteLine(order.Id);
    var header = context.EleOrderHeader.Where(x => x.OrderId == order.Id).First();
    // Console.WriteLine(header.UUID);
    order.MessageHeader = header;
    // System.Console.WriteLine(order.MessageHeader.UUID);
    var requests = context.EleOrderRequest.Where(x => x.OrderId == order.Id).ToList();
    // System.Console.WriteLine(requests.Count);
    foreach (var request in requests)
    {
        var rows = context.EleOrderRow.Where(x => x.RequestId == request.Id).ToList();
        foreach (var row in rows)
        {
            var rowItems = context.EleOrderRowItem.Where(x => x.RowId == row.Id).ToList();
            row.RowItems = rowItems;
        }
        request.Rows = rows;
    }
    order.Requests = requests;
    TestDbMapper(order);
    break;
}

标签:set,get,request,外键,order,linq,efcore,var,public
From: https://www.cnblogs.com/zhuoss/p/18157331

相关文章

  • ef core 如何关联查询外键表
    在EFCore中,如果查询查询外键表的内容实体publicclassBlog{publicintBlogId{get;set;}publicstringUrl{get;set;}publicList<Post>Posts{get;set;}//集合导航属性publicList<Comment>Comments{get;set;}//集合导航属性}......
  • LINQ常功能整理
    LINQ(Language-IntegratedQuery)是C#语言中的一个强大的查询技术,它提供了一种统一的查询语法,可以用于查询和操作各种数据源,包括集合、数据库、XML等。下面详细描述了LINQ的20个功能点,并提供了相应的源代码。查询集合中的所有元素:int[]numbers={1,2,3,4,5};varque......
  • 【转载】异步 LINQ
    原文:https://blog.csdn.net/zls365365/article/details/124395742LINQ这个东西,出来很早了,写过几年代码的兄弟们,或多或少都用过一些。早期的LINQ,主要是同步的,直到C#8.0加入IAsyncEnumerable,LINQ才真正转向异步。这本来是个非常好的改变,配合System.Linq.Async库提供的扩......
  • ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1)
    ASP.NETMVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1) 本系列的的角色权限管理主要采用Dotnet MVC4工程内置的权限管理模块Simplemembership实现,主要有关文件是InitializeSimpleMembershipAttribute.cs和AccountModels.cs下面是对这两个文件的了解和改造 WebSe......
  • ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6)
    ASP.NETMVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6) 快过年了,公司事情忙,好几天没有继续写博客,今天开始写账户模块系统登录,账户管理以及登录日志,首先新建登录日志数据表: ViewCode然后更改模型:AccountModels.cs ViewCode创建登录日志模型:M_UsersLoginLogs.cs View......
  • Bogus 实战:使用 Bogus 和 EFCore 生成模拟数据和种子数据【完整教程】
    引言上一章我们介绍了在xUnit单元测试中用xUnit.DependencyInject来使用依赖注入,上一章我们的Sample.Repository仓储层有一个批量注入的接口没有做单元测试,今天用这个示例来演示一下如何用Bogus创建模拟数据,和EFCore的种子数据生成Bogus的优势丰富的数据生成支持:Bogus提......
  • Linq补充学习
    1.Select和SelectMany方法SelectMany<TSource,TResult>(IEnumerable<TSource>,Func<TSource,IEnumerable<TResult>>)将序列的每个元素投影到IEnumerable并将结果序列合并为一个序列。1.使用SelectMany<TSource,TResult>(IEnumerable,Func<TSource,IEnumerable&......
  • 第三十一节:批量插入框架[Zack.EFCore.Batch]和EFCore8.x自带的批量删除、更新
    一. 说明1.目标 这里主要测试EFCore8.x版本提供的批量删除和批量更新;以及老杨的框架[Zack.EFCore.Batch] 以SQLServer为载体进行测试。2.准备(1).需要的程序集  必须的程序集:  Microsoft.EntityFrameworkCore.Tools  EF自身的程序集:Microsoft.......
  • 关系、导航属性和外键
    关系、导航属性和外键项目2023/08/2411个参与者反馈 本文内容EF中的关系配置或映射关系创建和修改关系同步外键和导航属性之间的更改显示另外3个本文概述实体框架如何管理实体之间的关系,还提供有关如何映射和操作关系的一些指导。EF中的关系在关系......
  • Entity Framework 自定义外键关系
    EntityFramework自定义外键关系在EntityFramework中,你可以通过在模型类中使用属性来定义自定义外键关系。以下是一个简单的例子,展示了如何在两个实体之间创建一对一的关联关系:  publicclassUser{publicintUserId{get;set;}publicstringUsername......