跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp EF 代码优先(Code First)
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C# EF 代码优先(Code First) = '''Entity Framework (EF) 代码优先'''(Code First)是微软推出的一种面向对象的数据库开发方法,允许开发者通过定义C#类来创建数据库结构,而无需手动编写SQL脚本或使用数据库设计工具。它属于ORM(对象关系映射)技术的一部分,适用于需要快速开发、灵活调整数据模型的场景。 == 核心概念 == 代码优先方法的核心思想是: * 开发者首先编写领域模型(POCO类) * EF根据这些类自动生成数据库架构 * 支持数据库迁移(Migrations)来同步模型变更 === 与传统方法的对比 === {| class="wikitable" |- ! ADO.NET / 数据库优先 !! EF 代码优先 |- | 先设计数据库表结构 | 先编写C#类 |- | 手动编写SQL语句 | 自动生成SQL |- | 修改需调整表结构 | 修改类后运行迁移命令 |} == 基础实现步骤 == 以下是实现EF代码优先的基本流程: === 1. 安装NuGet包 === <syntaxhighlight lang="powershell"> Install-Package EntityFramework </syntaxhighlight> === 2. 创建领域模型 === <syntaxhighlight lang="csharp"> public class Blog { public int BlogId { get; set; } public string Name { get; set; } // 导航属性 public virtual ICollection<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } // 外键 public int BlogId { get; set; } // 导航属性 public virtual Blog Blog { get; set; } } </syntaxhighlight> === 3. 创建DbContext === <syntaxhighlight lang="csharp"> public class BlogContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } </syntaxhighlight> === 4. 配置连接字符串 === 在App.config或Web.config中添加: <syntaxhighlight lang="xml"> <connectionStrings> <add name="BlogContext" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=BlogDB;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings> </syntaxhighlight> == 数据库迁移 == 代码优先的强大功能之一是支持数据库架构的版本控制: === 启用迁移 === <syntaxhighlight lang="powershell"> Enable-Migrations </syntaxhighlight> === 创建迁移 === <syntaxhighlight lang="powershell"> Add-Migration InitialCreate </syntaxhighlight> === 更新数据库 === <syntaxhighlight lang="powershell"> Update-Database </syntaxhighlight> == 高级配置 == === 数据注解 === 可以通过特性配置模型: <syntaxhighlight lang="csharp"> [Table("BlogArticles")] public class Blog { [Key] public int PrimaryKey { get; set; } [Required] [MaxLength(100)] public string Name { get; set; } } </syntaxhighlight> === Fluent API === 在DbContext中重写OnModelCreating方法: <syntaxhighlight lang="csharp"> protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Name) .IsRequired() .HasMaxLength(100); } </syntaxhighlight> == 实际应用案例 == '''场景:'''开发一个简单的博客系统 === 模型定义 === <syntaxhighlight lang="csharp"> public class Author { public int AuthorId { get; set; } public string Name { get; set; } public ICollection<Blog> Blogs { get; set; } } // 扩展之前的Blog类 public class Blog { //...其他属性 public int AuthorId { get; set; } public Author Author { get; set; } } </syntaxhighlight> === 数据库查询示例 === <syntaxhighlight lang="csharp"> using (var context = new BlogContext()) { // 添加数据 var author = new Author { Name = "张三" }; context.Authors.Add(author); var blog = new Blog { Name = "EF教程", Author = author }; context.Blogs.Add(blog); context.SaveChanges(); // 查询数据 var blogsWithAuthors = context.Blogs .Include(b => b.Author) .ToList(); } </syntaxhighlight> == 性能优化 == * '''延迟加载''':使用virtual关键字标记导航属性 * '''预先加载''':使用Include方法 * '''批量操作''':使用AddRange/RemoveRange === 批量插入示例 === <syntaxhighlight lang="csharp"> var blogs = new List<Blog>(); for (int i = 0; i < 1000; i++) { blogs.Add(new Blog { Name = $"Blog {i}" }); } context.Blogs.AddRange(blogs); context.SaveChanges(); </syntaxhighlight> == 架构图 == <mermaid> classDiagram class Blog { +int BlogId +string Name +ICollection<Post> Posts } class Post { +int PostId +string Title +string Content +int BlogId +Blog Blog } Blog "1" --> "*" Post </mermaid> == 数学表示 == 关系模型可以表示为: <math> R(Blog) = (BlogId, Name, ...) </math> <math> R(Post) = (PostId, Title, Content, BlogId, ...) </math> 外键约束: <math> BlogId \in Post \rightarrow BlogId \in Blog </math> == 常见问题 == '''Q: 如何处理现有数据库?''' A: 使用逆向工程工具"EF Power Tools"或Scaffold-DbContext命令 '''Q: 如何执行原始SQL?''' A: 使用DbContext.Database.SqlQuery方法 '''Q: 并发冲突如何解决?''' A: 使用[ConcurrencyCheck]特性或配置RowVersion == 最佳实践 == * 保持POCO类简单 * 将配置分离到单独的类 * 使用仓储模式抽象DbContext * 为频繁查询添加适当的索引 == 总结 == EF代码优先提供了一种高效的数据库开发方式,特别适合: * 快速原型开发 * 领域驱动设计(DDD)项目 * 需要频繁修改数据模型的场景 通过合理使用迁移、配置和优化技术,可以构建出既灵活又高性能的数据访问层。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 数据库编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)