EF——CodeFirst

本文详细介绍了CodeFirst开发模式的概念、优势以及创建流程。CodeFirst是一种基于代码的设计模式,它以代码为中心进行数据库设计,无需预先了解数据库结构。通过简单的模型类实现数据库操作,支持灵活的映射定制,并易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   在上篇博文中介绍了ModelFirst创建的过程,今天简单介绍一下CodeFirst。


    CodeFirst是基于Entity Framework的新的开发模式,原先只有Database First和Model First两种。CodeFirst是以代码为中心进行设计的,在具体操作过程中,我们不需要知道数据库的结构。它支持更加优美的开发流程,它允许编写简单的模型对象POCO (plain old classes),而不需要基类。可以通过"约定优于配置",使得数据库持久层不需要任何的配置,也可以覆盖“约定优于配置”,通过流畅的API来完全定制映射。


    接下来简单介绍一下CodeFirst的创建流程:

    1)先建立控制台程序CodeFirst,创建自己所需要的类:

    在此,创建两个简单的类作为演示:Customer类、OrderInfo类。

   


    顾客类:设置Id为主键

<strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;    //添加引用

namespace CodeFirst
{
     public class Customer  
    { 
         [Key]
        public int Id { get; set; }  
  
        public string CusName { get; set; }

        //建立和orderInfo的对应关系,是一对多的关系,所以是一个集合
        public virtual ICollection<OrderInfo> order { get; set; }  
  
    }  
}</strong>

   

    创建订单信息类OrderInfo,设置Id为主键

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace CodeFirest
{
    public class OrderInfo
    {
        [Key]  //声明主键
        public int Id { get; set; }  
  
       public string content { get; set; }  
       /// <summary>  
       /// 外键  
      /// </summary>  
       public int customerId { get; set; }  
 
       public Customer Customer { get; set; }

    }


     2)需要注意的是,在编码过程中添加所需引用

   


    3)新增Context类:

<strong>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace CodeFirst
{
    public class HotelDbContext :DbContext
    {
        public HotelDbContext()
            : base("name=ConnCodeFirst")
        {
        }
        public DbSet<Customer> Customer { get; set; }

        public DbSet<OrderInfo> OrderInfo { get; set; }

    }
}
</strong>


    4)在main方法中写入创建数据库的方法:如果数据库不存在,创建数据库

<strong> static void Main(string[] args)
        {
            HotelDbContext dbContext = new HotelDbContext();
            dbContext.Database.CreateIfNotExists( );  //创建数据库  如果不存在的话
        }</strong>


        5)添加配置文件:创建连接字符串

<strong><?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
<connectionStrings >
  <add name="ConnCodeFirst" connectionString="server=192.168.24.99;uid=sa;pwd=123456;database=CodeFirst"   
 providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration></strong>


    运行后,生成数据库如下:

   


    到此为止,CodeFirst生成数据库就完成了。和另外两种生成方式相比,CodeFirst创建方式更易于维护,至于具体使用哪种方式,还要视情况而定。



                                                             


                                                              ------------------------------------


### C# Entity Framework Code First 使用教程 Entity Framework (EF) 是一种流行的 ORM(对象关系映射)框架,用于简化 .NET 应用程序中的数据访问操作。Code First 方法允许开发者通过编写实体类来定义数据库结构,而无需手动创建数据库表。 #### 数据库初始化与迁移机制 当使用 EFCode First 方法时,如果发现数据库中缺少预期的表,通常是因为数据库初始化策略未正确执行或者迁移尚未被应用[^1]。为了确保新添加的实体类能够生成对应的数据库表,可以按照以下方法处理: 1. **配置数据库上下文** 需要继承 `DbContext` 类并注册所有的实体类到该上下文中。例如: ```csharp public class MyDbContext : DbContext { public DbSet<MyEntity> Entities { get; set; } } public class MyEntity { public int Id { get; set; } public string Name { get; set; } } ``` 2. **启用自动迁移或显式迁移** 自动迁移会在每次运行应用程序时尝试更新数据库模式以匹配模型更改。然而,在生产环境中更推荐使用显式迁移以便更好地控制变更过程。可以通过 NuGet 控制台命令实现迁移功能: - 启用迁移支持:`Enable-Migrations` - 创建新的迁移脚本:`Add-Migration MigrationName` - 更新本地数据库至最新状态:`Update-Database` 3. **设置初始策略** 如果希望在首次启动项目时自动生成数据库,则需指定合适的初始化器。常见的选项有 `CreateDatabaseIfNotExists<T>` 和 `DropCreateDatabaseAlways<T>` 等。注意这些默认行为可能会因版本不同有所调整。 #### 常见问题及其解决方案 - **问题一**: 新增实体后为何无法看到对应的数据表? 解决方案在于确认是否已成功完成上述提到的所有必要步骤——即不仅要在代码层面增加实体定义以及将其加入 DbSets 列表里头,而且还需要实际运用 Migrate 或 Update-Database 来同步改动到真实存在的 DB 上去才行。 - **问题二**: 如何调试 Code First 流程期间发生的错误? 可利用日志记录工具捕获 SQL 查询语句从而定位潜在冲突点;另外也可以借助 Visual Studio 内置诊断窗口观察异常堆栈信息进一步分析根本原因所在之处。 ```csharp public static void Main() { using var context = new MyDbContext(); Database.SetInitializer(new CreateDatabaseIfNotExists<MyDbContext>()); } ```
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值