EF - CodeFirst 详细操作流程
比如, 现在我们需要两张表, "学生表" 和 "班级表" , 一对多关系, 怎么用CodeFirst的方式创建数据库数据表
1.创建两个实体类
public class StudentInfo { //特性标签Key, 标记Id为实例的唯一标识符, 即主键 [Key] public int Id { get; set; } [StringLength(32)] //varchar 必须指定长度, 否则默认长度为max [Required] //不允许为空 public string StuName { get; set; } public DateTime SubTime { get; set; } //CodeFirst中体现两张表的关系 //相当于EF模型中的导航属性 //一个学生 只能对应 一个班级 public virtual ClassInfo ClassInfo { get; set; } } public class ClassInfo { [Key] public int Id { get; set; } [StringLength(32)] [Required] public string ClassName { get; set; } public DateTime CreateTime { get; set; } //CodeFirst中体现两张表的关系 //相当于EF模型中的导航属性 //一个班级 可以对应 多个学生 public virtual ICollection<StudentInfo> StudentInfo { get; set; } }
2.创建和数据库交互的EF上下文类, 继承自DbContext
public class CodeFirstDbContext : DbContext { //1.需要一个构造方法, 调用父类的构造方法, 传入 数据库连接字符串 的名字作为参数 public CodeFirstDbContext() : base("name=connStr") //需配置数据库连接字符串 { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //2.去掉 将表名设置为实体类型名称的复数版本 的约定(如 对应ClassInfo 在数据库生成 ClassInfos表) modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } //3. public DbSet<StudentInfo> StudentInfo { get; set; } public DbSet<ClassInfo> ClassInfo { get; set; } }
3.配置数据库连接字符串, 名称与 EF上下文操作类 的构造方法中传入的参数保持一致
<connectionStrings> <add name="connStr" connectionString="server=.;uid=sa;pwd=123456;database=CodeFirstModel" providerName="System.Data.SqlClient" /> </connectionStrings>
4.执行代码, 生成数据库, 并添加一条数据
class Program { static void Main(string[] args) { CodeFirstDbContext db = new CodeFirstDbContext(); db.Database.CreateIfNotExists(); //如果数据库不存在就自动创建 ClassInfo classInfo = new ClassInfo(); classInfo.ClassName = "0302班"; classInfo.CreateTime = DateTime.Now; db.ClassInfo.Add(classInfo); db.SaveChanges(); } }
5.打开sqlserver数据库,查看结果
————————————————
版权声明:本文为CSDN博主「sosososolong」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sosososolong/article/details/87896733
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构