首页 > 其他分享 >跟着杨中科学习(五)EFCore(三)

跟着杨中科学习(五)EFCore(三)

时间:2024-06-11 17:12:34浏览次数:23  
标签:set get builder Comments 中科 EFCore article public 跟着

通过代码查看EFCore自动生成的数据

1.标准日志

//依赖注入的使用方式
public static readonly ILoggerFactory
    
MyLoggerFactory= LoggerFactory.Create(builder =>
{builder.AddConsole();});

optionsBuilder.UseLoggerFactory(MyLoggerFactory);
//普通方式
 class MyDbConnect : DbContext
 {
     private static ILoggerFactory loggerFactory = LoggerFactory.Create(b=>b.AddConsole());//添加到控制台
     public DbSet<Books> Books { get; set; }

     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     {
         base.OnConfiguring(optionsBuilder);
         optionsBuilder.UseSqlServer("Server =. ;Database=EFCoreDemo; Trusted_Connection=True;MultipleActiveResultSets = true");
         optionsBuilder.UseLoggerFactory(loggerFactory);//添加日志

     }
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         base.OnModelCreating(modelBuilder);
         //从当前程序集中寻找实现IEntityTypeConfiguration<>接口的类
         modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
     }
 }

2.简单日志

 // optionsBuilder.LogTo()
class MyDbConnect : DbContext
 {
     public DbSet<Books> Books { get; set; }
     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     {
         base.OnConfiguring(optionsBuilder);
         optionsBuilder.UseSqlServer("Server =. ;Database=EFCoreDemo; Trusted_Connection=True;MultipleActiveResultSets = true");
         optionsBuilder.LogTo(mes => { Console.WriteLine(mes); });
     }
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         base.OnModelCreating(modelBuilder);
         //从当前程序集中寻找实现IEntityTypeConfiguration<>接口的类
         modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
     }
 }

3.TOQUERYSTRING

EF Core的Where方法返回的是IQueryable类型,
DbSet也实现了IQueryable接口。IQueryable有扩展方
法ToQueryString()可以获得SQL。

只能获取查询操作的

IQueryable<TPerson> persons = ctx. TPersons. Where(p => p. Name. ToLower () == ".BirthDay == DateTime.Now);
string sql = persons. ToQueryString () :

IQueryble和IEumerable的区别与联系

  • IQueryable继承自IEnumerable,这意味着任何IQueryable<T>的实现也提供了IEnumerable<T>接口的功能。
  • 它们都用于遍历集合,但IQueryable提供了更高级的查询功能,特别是与数据库查询相关的功能。
  • 当你需要对本地集合进行简单的遍历时,使用IEnumerable
  • 当你需要构建一个可以被优化并可能在远程数据源(如数据库)上执行的查询时,使用IQueryable

使用规范

  • 写测试性代码,用简单日志;
  • 正式需要记录SQL给审核人
    员或者排查故障,用标准日志;
  • 开发阶段,从繁杂的查询
    操作中立即看到SQL,用ToQueryString()。

EFCore一对多关系配置

EF Core中实体之间关系的配置的套路:

  • 一对多:HasOne( ... ).WithMany( .. );
  • 一对一:HasOne( ... ).WithOne( ... );
  • 多对多:HasMany( ... ).WithMany( ….. );
 class Article
 {
     public int Id { get; set; }
     public string Title { get; set; }
     public string Message { get; set; }
     public List<Comment> Comments { get; set; } = new List<Comment>();
 }
//////////////////////////////////////////////////////////
 class Comment
 {
     public int Id { get; set; }
     public string Message { get; set; }
     public Article article { get; set; }
 }
class ArticleConfig : IEntityTypeConfiguration<Article>
{
    public void Configure(EntityTypeBuilder<Article> builder)
    {
        builder.ToTable("T_Articles");
    }
}
////////////////////////////////////////////////////////
 class CommentConfig : IEntityTypeConfiguration<Comment>
 {
     public void Configure(EntityTypeBuilder<Comment> builder)
     {
         builder.ToTable("T_Comments");
         builder.HasOne<Article>(c => c.article).WithMany(c => c.Comments).IsRequired();//一对多,一个Article对应多个Comments
     }
 }
 private static async Task Main(string[] args)
 {
     using (MyDbConnect connect=new MyDbConnect())
     {
         Article article = new Article();
         article.Title = "Gucgres";
         article.Message = "是真的,是真的";
         Comment comment01 = new Comment { Message = "好" };
         Comment comment02 = new Comment { Message = "差劲" };
         article.Comments.Add(comment01);
         article.Comments.Add(comment02);
         connect.Articles.Add(article);
         connect.SaveChangesAsync();
         Console.ReadKey();
     }
 }

EFCore一对多关系的获取

private static async Task Main(string[] args)
{
    using (MyDbConnect connect=new MyDbConnect())
    {
        //using Microsoft.EntityFrameworkCore;
        Article article = connect.Articles.Include(a=>a.Comments).FirstOrDefault(e=>e.Id==1);
        foreach (var item in article.Comments)
        {
            await Console.Out.WriteLineAsync(item.Message);
        }
        connect.SaveChangesAsync();
        Console.ReadKey();
    }
}

Include()关键字可以关联查询

EFCore额外的外键字段

为什么需要外键属性
1、EF Core会在数据表中建外键列。
2、如果需要获取外键列的值,就需要做关联查询,效
率低。
3、需要一种不需要Join直接获取外键列的值的方式。

解决方法,手动增加外键

 builder.HasOne<Article>(c => c.article).WithMany(c => c.Comments).HasForeignKey(c=>c.TheArticleId).IsRequired();

单向导航属性

从一个属性可以访问到另一种类型的一个实体

class Article
 {
     public int Id { get; set; }
     public string Title { get; set; }
     public string Message { get; set; }
     public List<Comment> Comments { get; set; } = new List<Comment>();
 }
//////////////////////////////////////////////////////////
 class Comment
 {
     public int Id { get; set; }
     public string Message { get; set; }
     public Article article { get; set; }
 }

article和comment加起来就是双向导航属性。

单项导航属性

不设置反向的属性,然后配置的时候
WithMany()不设置参数即可。

class LeaveConfig : IEntityTypeConfiguration<Leave>
{
    public void Configure(EntityTypeBuilder<Leave> builder)
    {
        builder. ToTable("T_Leaves");
        builder. HasOne<User>(1 => 1.Requester). WithMany (). IsRequired ();
    }
}



CommentConfig:

builder.HasOne<Article>(c=>c.Article).WithMany(a=>
a.Comments).IsRequired();

ArticleConfig:

builder.HasMany<Comment>(a=>a.Comments).WithOne(c=>
c.Article).IsRequired();

标签:set,get,builder,Comments,中科,EFCore,article,public,跟着
From: https://www.cnblogs.com/guan-tou6/p/18242378

相关文章

  • 无线通信SCI期刊,中科院一区TOP,IF=12.9,专业性强,文章质量高
    一、期刊名称IEEEWirelessCommunications二、期刊简介概况期刊类型:SCI学科领域:无线通信影响因子:12.9中科院分区:1区TOP三、期刊征稿范围IEEE无线通信是为在通信和网络社区工作的个人设计的。它涵盖了与所有媒体(以及媒体组合)和所有协议层的个性化、位置独立通信相......
  • 计算机SCI期刊,中科院3区,IF=3.4,难度不大,无预警风险
    一、期刊名称AutomatedSoftwareEngineering二、期刊简介概况期刊类型:SCI学科领域:计算机科学影响因子:3.4中科院分区:3区三、期刊征稿范围自动化软件工程是一份档案,同行评审的期刊,发表研究,教程论文,调查和自动化软件工程技术的基础,技术,工具和应用方面的重要行业经验......
  • 能源SCI期刊,中科院1区TOP,IF=8.7,审稿速度快,对国人非常友好
    一、期刊名称RenewableEnergy二、期刊简介概况期刊类型:SCI学科领域:能源影响因子:8.7中科院分区:1区TOP三、期刊征稿范围《可再生能源》杂志旨在促进和传播有关可再生能源系统和组件的各种主题和技术的知识。该杂志旨在为研究人员,工程师,经济学家,制造商,非政府组织,协会......
  • 大学体育(二)(华中科技大学) 中国大学MOOC答案2024版100分完整版
    大学体育(二)(华中科技大学)中国大学MOOC答案2024版100分完整版有氧运动有氧运动单元测验1、世界卫生组织对18-64岁年龄组成年人的运动建议是:每周至少()分钟的中等强度有氧身体活动,或者每周至少()分钟的较高强度有氧身体活动,或中等和较高强度两种活动相当量的组合。A:150......
  • 跟着GPT学习Java线程中断机制
    Java中的线程中断是一个复杂但非常重要的概念,它允许一个线程告知另一个线程希望它停止正在做的事情。这个机制是协作式的,意味着被请求中断的线程需要自己检查中断状态,并且决定如何响应中断请求。下面我将系统地讲解Java中的线程中断知识点。 1.中断标志每个线程都有一个内部......
  • 跟着杨中科学习(四)EFCore(二)
    主键自增主键自动增长。优点:简单;缺点:数据库迁移以及分布式系统中比较麻烦;并发性能差。long、int等类型主键,默认是自增。因为是数据库生成的值,所以SaveChanges后会自动把主键的值更新到Id属性。试验一下。场景:插入帖子后,自动重定向帖子地址。自增字段的代码中不能......
  • 计算机SCI期刊,中科院2区,IF=6.9,收稿范围非常广泛
    一、期刊名称JournalofKingSaudUniversity—ComputerandInformationSciences二、期刊简介概况期刊类型:SCI学科领域:计算机科学影响因子:6.9中科院分区:2区三、期刊征稿范围《沙特国王大学计算机与信息科学杂志》是一本国际性的参考期刊,涵盖了计算机基础及其实......
  • EFCore和EF6的使用和区别
    1、Sqlserver是微软的亲儿子,很少会报错,EF报错问题最多出现在Mysql。以下使用mysql为例子C#一般很形象,带Core的都是.NetCore平台的。所以在.NetFramework平台我们使用EF6,也就是EntityFramework6在.NetCore平台使用EFCore2、直接上代码(.Net6)internalclassProgram{......
  • 跟着GPT学设计模式之观察者模式
    你好,这里是codetrend专栏“跟着GPT学设计模式”。引言观察者模式(ObserverPattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其依赖对象都能够收到通知并自动更新。观察者模式(ObserverDesignPattern)也被称为发布订阅模式(Publish-S......
  • 跟着杨中科学习(二)日志
    日志系统日志级别Trace<Debug<Information<Warning<Error<Critical输出到控制台NugetMicrosoft.Extensions.LoggingMicrosoft.Extensions.Logging.ConsoleDI注入services.AddLogging(logBuilder=>{ logBuilder.AddConsole();//可多个ProciderlogBuilder.SetMini......