book_dotnet

博客介绍了多本Microsoft.NET相关书籍,包括《Microsoft.NET框架程序设计(修订版)》《ADO.NET技术内幕》等,涉及.NET、ASP.NET、C#等技术,还给出了每本书的作者、译者、出版社及评价等关键信息。

原著书名Applied Microsoft .NET Framework programming
译本书名
Microsoft .NET框架程序设计(修订版)
作者:       [美] Jeffrey Richter     
译者:     李建忠
出版社:    清华大学出版社
评价:     Jeffrey Richter 的这本书跟他的《windows核心编程》一样,堪称奠基之作。

原著书名:Microsoft ADO.NET
译本书名:ADO.NET技术内幕 
作者:       [美] David Sceppa     
译者:    
粱超 张莉 贺堃
出版社:    清华大学出版社
评价:     言语无味,直到用的时候方觉得实用。作者可以说是一个纯技术人才:)

原著书名:Essential ASP.NET with Examples in C#
译本书名:ASP.NET基础教程——C#案例版
作者:
        [美] Fritz Onion     
译者:     
施诺
出版社:     清华大学出版社
评价:      本书并没有把笔墨花费到怎么使用WebControl和HtmlControl控件上,相反,他着重讲解了asp.net的设计原理和运作原理,以及它是如何把html转化成C#的类的。另外,作者还有一本同样的《ASP.NET基础教程——VB.net案例版》内容是一样的,不要买重了。

原著书名:Inside Microsoft .NET IL Assembler
译本书名:Microsoft.NET IL汇编语言程序设计 
作者:        [加]Serge Lidin
译者:     
袁勤勇 何欣 卢冬梅
出版社:     清华大学出版社
评价:      IL 是了解.Net最直接最有效的工具。无论.NET开发者所偏好的语言和从事的开发领域是什么,在他们的计算机屏幕上都会有一个青色的闪电——ILDASM图标在闪光。

原著书名:用实例学CRYstal Report for Visual Studio.NET
作者:        章立民
出版社:     电子工业出版社
评价:      台湾人写的书,看起来很轻松。内容很浅显,也很实用,能让你一天就学会如何作子报表、交叉表。

原著书名:C# Primer A Practical Approach
译本书名:C# PRIMER中文版 
作者:        Stanley B.Lippman     
译者:      
侯捷 陈硕
出版社:     华中科技大学出版社
评价:      300多页的小书,什么都讲到了,什么都没讲多少。食之有味、不多,弃之可惜。此书和Lippman的《C++ Primer》真是感觉两个天地。







<think>嗯,用户想了解EFCore在.NET中的使用方法和示例,并且引用了多篇相关文档。从引用内容看,用户可能正在尝试从零开始搭建一个使用EFCore的项目,需要从基础安装到高级特性的完整指导。用户引用的资料涵盖了SQLServer和MySQL两种数据库,说明ta可能还在技术选型阶段。引用中特别提到了数据库迁移、DbFirst/CodeFirst、审计跟踪等关键词,这些都是EFCore的核心功能点。不过用户没有明确数据库类型,所以我需要同时覆盖主流数据库的配置差异。我注意到用户上次回复中强调“尽可能多的参考用户上一次的问题”,但这是首次关于EFCore的提问。可能需要从最基础的步骤开始:安装->配置->建模->查询->数据操作->迁移管理。特别要突出CodeFirst和DbFirst两种开发模式的对比,因为引用[2]显示用户对两者都有兴趣。高级部分要包含审计拦截器的实现,因为引用[3]提到动态JSON和审计跟踪,说明用户可能有合规性需求。PostgreSQL的jsonb类型配置也值得单独说明,虽然用户没提但引用[3]显示这是实际生产可能遇到的场景。代码示例要兼顾不同数据库提供程序:SQLServer用标准语法,MySQL用Pomelo扩展,PostgreSQL用Npgsql配置。所有命令都要明确区分dotnetcli和packagemanagerconsole两种执行方式——虽然用户目前只用cli,但后者在VisualStudio中更常见。对了,用户没有说明使用的.NET版本,但引用[3]提到.NET8,所以默认按最新版本语法。要特别注意EFCore8的新特性如JSON列映射,这个在引用[3]的audittrails场景很实用。最后准备的问题清单要覆盖用户可能需要的延伸知识:性能优化(引用[1]显示用户关注效率)、复杂类型映射(审计日志需要)、多数据库支持(用户引用多种数据库)等。特别是迁移冲突解决,这是团队协作时的常见痛点。</think> 好的,在 .NET 中使用 Entity Framework Core (EF Core) 作为 ORM 框架是非常常见的做法,它能极大地简化数据库操作。以下将结合你提供的参考信息和标准实践,为你讲解 EF Core 在 .NET 中的核心使用方法和示例。 **核心概念与步骤** 1. **安装 NuGet 包**: * **必需的核心包**:`Microsoft.EntityFrameworkCore` * **数据库提供程序包** (任选其一): * SQL Server:`Microsoft.EntityFrameworkCore.SqlServer` * MySQL (推荐使用 Pomelo):`Pomelo.EntityFrameworkCore.MySql` (引用[2], [4]) 或 `MySql.EntityFrameworkCore` (官方) * PostgreSQL:`Npgsql.EntityFrameworkCore.PostgreSQL` (引用[3]) * SQLite:`Microsoft.EntityFrameworkCore.Sqlite` * **工具包** (用于命令行迁移等操作):`Microsoft.EntityFrameworkCore.Tools` (引用[1]) * **安装方式**: * **.NET CLI (推荐)**: ```bash dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer # 例如 SQL Server dotnet add package Microsoft.EntityFrameworkCore.Tools ``` * **Visual Studio Package Manager Console**: ``` Install-Package Microsoft.EntityFrameworkCore Install-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFrameworkCore.Tools ``` * **Visual Studio GUI**: 通过 “管理 NuGet 包…” 界面搜索安装。 2. **创建 DbContext 类**: * 这是 EF Core 的核心类,代表与数据库的会话,用于查询和保存实体实例。 * 继承自 `DbContext`。 * 定义 `DbSet<T>` 属性,每个属性对应数据库中的一个表。 * 通常在构造函数中配置数据库连接 (通过 `DbContextOptions` 或依赖注入)。 * **示例 (基本版)**: ```csharp using Microsoft.EntityFrameworkCore; namespace MyApp.Data { public class ApplicationDbContext : DbContext { // DbSet 属性表示数据库中的表 public DbSet<Book> Books { get; set; } public DbSet<Author> Authors { get; set; } // 方式1:配置连接字符串 (在简单场景或测试中使用) protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=MyLibraryDb;Trusted_Connection=True;"); // 或 UseMySql, UseNpgsql, UseSqlite 等 (引用[2], [3]) } // 方式2(强烈推荐生产环境):通过依赖注入传递配置 (在Startup.cs/Program.cs中配置) public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } // (可选) 配置模型、关系、索引等 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Author>().HasKey(a => a.AuthorId); // 显式定义主键(默认规则够用时可不写) modelBuilder.Entity<Book>() .HasOne(b => b.Author) // 一个 Book 有一个 Author .WithMany(a => a.Books) // 一个 Author 有多个 Book .HasForeignKey(b => b.AuthorId); // 外键 } } } ``` 3. **定义实体类**: * 这些是普通的 C# 类 (POCOs),代表数据库中的表。 * 类名通常对应表名,属性对应列名。EF Core 默认按约定映射。 * **示例 (`Book.cs`, `Author.cs`)**: ```csharp public class Book { public int BookId { get; set; } // 约定:名为Id或<类名>Id的属性通常被视为主键 public string Title { get; set; } public DateTime PublishedDate { get; set; } // 导航属性 (定义关系) public int AuthorId { get; set; } // 外键 (命名约定:<导航属性名>Id) public Author Author { get; set; } // 引用导航属性 (关联的Author) } public class Author { public int AuthorId { get; set; } public string Name { get; set; } public string Biography { get; set; } // 集合导航属性 (关联的Books) public ICollection<Book> Books { get; set; } = new List<Book>(); } ``` 4. **配置数据库连接 (推荐方式 - 依赖注入)**: * 在应用程序启动文件 (`Startup.cs` 或 `.NET 6+` 的 `Program.cs`) 中配置服务。 * **示例 (`Program.cs` - .NET 6+)**: ```csharp var builder = WebApplication.CreateBuilder(args); // 从配置文件中读取连接字符串 (引用[5]) var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); // 添加 DbContext 到服务容器 builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString)); // 根据数据库类型选择 UseMySql, UseNpgsql 等 // 特定数据库配置示例 (如PostgreSQL Npgsql动态JSON - 引用[3]) // .UseNpgsql(connectionString, npgsqlOptions => // { // npgsqlOptions.EnableDynamicJson(); // npgsqlOptions.MigrationsHistoryTable("__MyMigrationsHistory", "myschema"); // 自定义迁移历史表 // npgsqlOptions.UseSnakeCaseNamingConvention(); // 使用蛇形命名 // }) // .AddInterceptors(new AuditableInterceptor()); // 添加审计拦截器 (引用[3]) var app = builder.Build(); // ... 中间件管道配置 ... app.Run(); ``` 5. **数据库迁移 (Migraiton)**: * 当你修改了实体模型 (`DbSet<T>` 或实体类) 后,需要将这些更改应用到数据库结构。 * **Code-First 工作流的核心**:通过命令生成迁移脚本,然后执行它更新数据库。 * **步骤**: * 确保 `Microsoft.EntityFrameworkCore.Tools` 包已安装。 * **添加迁移** (在项目目录下): ```bash dotnet ef migrations add InitialCreate # 'InitialCreate' 是迁移名称 ``` * 这会创建一个 `Migrations` 文件夹,包含迁移代码 (`Timestamp_InitialCreate.cs`) 和模型快照 (`ApplicationDbContextModelSnapshot.cs`)。 * **应用迁移** (更新数据库结构): ```bash dotnet ef database update ``` * **DbFirst (数据库优先) 示例 (引用[2])**:如果你已经存在数据库并想反向工程生成实体类和 `DbContext`: ```bash dotnet ef dbcontext scaffold "Server=localhost;User Id=test;Password=123456;Database=TestDb" "Pomelo.EntityFrameworkCore.MySql" -o Models --context-dir Data ``` * 这会从指定的 `TestDb` (MySQL) 生成实体类到 `Models` 文件夹,生成 `DbContext` 到 `Data` 文件夹。 6. **使用 DbContext 进行 CRUD 操作**: * 在你的服务或控制器中注入 `ApplicationDbContext`。 * 通过 `DbSet<T>` 执行查询、插入、更新、删除操作。 * **示例 (伪代码)**: ```csharp // 依赖注入获取 DbContext private readonly ApplicationDbContext _context; public MyService(ApplicationDbContext context) { _context = context; } // 查询 (查询所有书及其作者) var booksWithAuthors = await _context.Books .Include(b => b.Author) // 显式加载关联数据 .ToListAsync(); // 查询 (根据ID查询一本书) var singleBook = await _context.Books.FindAsync(1); // 插入 var newAuthor = new Author { Name = "J.R.R. Tolkien" }; _context.Authors.Add(newAuthor); await _context.SaveChangesAsync(); // 保存更改到数据库 // 更新 var authorToUpdate = await _context.Authors.FindAsync(1); if (authorToUpdate != null) { authorToUpdate.Biography = "Updated biography..."; await _context.SaveChangesAsync(); } // 删除 var bookToDelete = await _context.Books.FindAsync(10); if (bookToDelete != null) { _context.Books.Remove(bookToDelete); await _context.SaveChangesAsync(); } ``` **关键概念总结** * **DbContext**: 数据库会话入口。管理连接、实体追踪、工作单元、更改跟踪。 * **DbSet<T>**: 代表数据库表。用于查询和修改对应的实体。 * **实体类**: POCOs,代表数据库表结构。包含数据属性和导航属性。 * **数据库提供程序**: 特定数据库的实现 (`UseSqlServer`, `UseMySql`, `UseNpgsql` 等)。 * **迁移 (Migrations)**: 管理数据库架构随时间演进的方式 (`dotnet ef migrations add`, `dotnet ef database update`)。 * **LINQ 查询**: EF Core 主要使用 LINQ (Language Integrated Query) 来构建数据库查询。查询会被 EF Core 翻译成 SQL。 * **变更追踪**: `DbContext` 会追踪它在内存中加载的实体的状态。当你修改实体并调用 `SaveChangesAsync()` 时,它会根据状态 (Added, Modified, Deleted, Unchanged) 生成对应的 SQL 语句。 **进阶主题参考引用** * **审计跟踪**: 如引用[3]所示,可以实现拦截器 (`IDbCommandInterceptor` 或 `SaveChangesInterceptor`) 来记录所有增删改操作。这通常涉及覆盖 `SaveChanges/SaveChangesAsync` 或在 `Program.cs` 中注册拦截器。 * **复杂配置**:通过 Fluent API (`OnModelCreating` 方法) 配置主键、索引、关系、并发令牌、字段类型、默认值等,提供了比 Data Annotations 更强大的控制能力 (引用[3]中的 `npgsqlOptions` 配置、`UseSnakeCaseNamingConvention`,引用[5]中的 `ConnectionStrings` 配置)。 * **性能优化**:关注查询性能 (如正确使用 `AsNoTracking`)、批量操作、连接池等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值