首页 > 其他分享 >Entity Framework教程-代码优先开发方式详解(Code First Development)

Entity Framework教程-代码优先开发方式详解(Code First Development)

时间:2022-10-12 08:55:47浏览次数:53  
标签:Development Code dbContextOptionsBuilder 配置 DbContextOptionsBuilder DbContext 开发

更新记录
转载请注明出处:
2022年10月12日 发布。
2022年10月9日 从笔记迁移到博客。

EF Core代码优先开发方式详解(Code First Development)

说明

记得先安装EF包,再使用

记得要给DbContext配置

默认构造函数

设置连接参数 否则不可以进行生成迁移

配置OnConfiguring方法

protected override void OnConfiguring(DbContextOptionsBuilder dbContextOptionsBuilder)

代码优先开发模式的步骤

1.Create Database Context with connectionString

2.Create the model as a C# .Net class to generate a table.

3.Add public properties to the model with a data type and a name for fields.

4.Add the entity to the DBContext (if not already there) as DBSet where T is the type of your model. If the model is already in the DBContext, proceed to step 4.

5.Generate a new code-first migration to apply any and all of the modeled changes using the add-migration command .

6.Update the database using the update-database command .

直接定义上下文对象DbContext方式

直接定义DbContext

using System;
using ConsoleApp6.Models;
using Microsoft.EntityFrameworkCore;

namespace ConsoleApp6.Repository
{
    public class PandaDbContext: DbContext
    {
        /// <summary>
        /// 选项配置器
        /// </summary>
        private DbContextOptionsBuilder _dbContextOptionsBuilder;

        /// <summary>
        /// 构造函数,支持外部配置项
        /// </summary>
        /// <param name="options">配置项</param>
        public PandaDbContext(DbContextOptions options) :base(options)
        {

        }

        /// <summary>
        /// 默认构造函数
        /// </summary>
        public PandaDbContext() :base()
        {
            this._dbContextOptionsBuilder = new DbContextOptionsBuilder();
            this._dbContextOptionsBuilder.UseSqlServer("Server=192.168.1.18;Database=PandaTest;User Id=sa;Password=password;");
        }

        /// <summary>
        /// 配置上下文对象
        /// </summary>
        /// <param name="dbContextOptionsBuilder">选项配置器</param>
        protected override void OnConfiguring(DbContextOptionsBuilder dbContextOptionsBuilder)
        {
            if(!dbContextOptionsBuilder.IsConfigured)
            {
                dbContextOptionsBuilder.UseSqlServer("Server=192.168.1.18;Database=PandaTest;User Id=sa;Password=password;");
            }
        }

        public DbSet<Product> Products { get; set; }
    }
}

直接定义DbContext 带 配置类扩展

记得先安装配置类的扩展

Microsoft.Extensions.Configuration

Microsoft.Extensions.Configuration.FileExtensions

Microsoft.Extensions.Configuration.Json

并新建appsettings.json文件用于保存配置信息

{
  "ConnectionStrings": {
    "Panda": "Server=192.168.1.18;Database=PandaTest;User Id=sa;Password=password;"
  }
}

Dbcontext代码:

using System;
using System.IO;
using ConsoleApp6.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace ConsoleApp6.Repository
{
    public class PandaDbContext: DbContext
    {
        /// <summary>
        /// 选项配置器
        /// </summary>
        private DbContextOptionsBuilder _dbContextOptionsBuilder;

        /// <summary>
        /// 构造函数,支持外部配置项
        /// </summary>
        /// <param name="options">配置项</param>
        public PandaDbContext(DbContextOptions options) :base(options)
        {

        }

        /// <summary>
        /// 默认构造函数
        /// </summary>
        public PandaDbContext() :base()
        {
            this._dbContextOptionsBuilder = new DbContextOptionsBuilder();
            this._dbContextOptionsBuilder.UseSqlServer("Server=192.168.1.18;Database=PandaTest;User Id=sa;Password=password;");
        }

        /// <summary>
        /// 配置上下文对象
        /// </summary>
        /// <param name="dbContextOptionsBuilder">选项配置器</param>
        protected override void OnConfiguring(DbContextOptionsBuilder dbContextOptionsBuilder)
        {
            if(!dbContextOptionsBuilder.IsConfigured)
            {
                //新建配置项生成器
                ConfigurationBuilder builder = new ConfigurationBuilder();
                //配置项生成器设置
                builder.SetBasePath(Directory.GetCurrentDirectory())
                        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                //构建配置
                var _configuration = builder.Build();
                //获得配置的具体字符串
                var cnstr = _configuration.GetConnectionString("Panda");
                //使用连接字符串
                dbContextOptionsBuilder.UseSqlServer(cnstr);
            }
        }

        public DbSet<Product> Products { get; set; }
    }
}

创建生成上下文DbContext对象的工厂类方式

using System;
using ConsoleApp6.Repository;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;

namespace ConsoleApp6
{
    public class PandaDbContextFactory : IDesignTimeDbContextFactory<PandaDbContext>
    {
        public PandaDbContext CreateDbContext(string[] args)
        {
            var optionsBuilder = new DbContextOptionsBuilder<PandaDbContext>();
            optionsBuilder.UseSqlServer("Server=192.168.1.198;Database=PandaTest;User Id=sa;Password=Password;");

            return new PandaDbContext(optionsBuilder.Options);
        }
    }
}

EF代码优先开发方式详解(Code First Development)

概述

使用CodeFirst方式进行开发,则可以不使用.edmx文件进行描述数据结构

而是使用手动定义类文件的方式定义数据结构

开发人员创建DbContext类和DbSet类型的继承对象来进行处理数据

与使用实体对象模型开发的对比

Code First方式没法使用EF Designer设计工具

Code First方式中仅保留了实体对象模型开发中的DbContext和DbSet类型

使用Code First方式手动开发示例

在项目中添加EF Nuget包

image

安装EF包

image

项目中新建一个Models文件夹

image

在Models文件夹下添加一个Product.cs类文件并写入Product类

image

在Models文件夹下进行PandaModel.cs文件并写入内容

注意:引入命名空间System.Data.Entity

image

配置App.config文件中的连接字符串

注意:除了手动配置连接信息外,还可以使用VS -【工具】-【连接到数据库】

<connectionStrings>
  <add name="pandaConnect" connectionString="data source=m1.panda666.com;initial catalog=PandaDatabase;persist security info=True;user id=sa;password=password;MultipleActiveResultSets=True;App=Entity Framework" providerName="System.Data.EntityClient"/>
</connectionStrings>

进行实际查询测试

using (PandaModel pandaModel = new PandaModel())
{
    var queryResult = from item in pandaModel.products
                        select item;
    foreach (Product item in queryResult)
    {
        Console.WriteLine("{0}-{1}-{2}",item.ProductId,item.ProductName,item.ProductType);
    }
}

标签:Development,Code,dbContextOptionsBuilder,配置,DbContextOptionsBuilder,DbContext,开发
From: https://www.cnblogs.com/cqpanda/p/16771205.html

相关文章

  • Codeforces1736C2. Good Subarrays (Hard Version)
    Codeforces1736C2.GoodSubarrays(HardVersion)题解:记\(ans[i]\)为以\(i\)为结尾最长的好的数列长度观察发现,以\(i\)为结尾的好的数列,长度可以是\(1,2,3,...,......
  • LeetCode算法笔记 566. 重塑矩阵
    importjunit.framework.TestCase;importjava.util.Arrays;publicclassLeetCode04_1extendsTestCase{/***566.重塑矩阵*在MATLAB中,有......
  • LeetCode算法笔记 121. 买卖股票的最佳时机
    importjunit.framework.TestCase;publicclassLeetCode03_2extendsTestCase{/***121.买卖股票的最佳时机*给定一个数组prices,它的第i......
  • WSL2中使用VSCode修改项目文件时报:VSCode : vscode-remote保存失败
    无法写入文件是因为当前用户没有权限改变当前用于到权限组remotesudochown-R$USER<directory_project>sudochown-Rlinfenghchs查看用户是否在对应的文件权限......
  • Codeforces Round #825 (Div. 2)
    CodeforcesRound#825(Div.2)\(A\)3min#include<bits/stdc++.h>usingnamespacestd;inta[105],b[105];intmain(){ intt;cin>>t; while(t--){ intn;cin>>......
  • codeforces 305B. Continued Fractions (递归的思想)
    ​​http://codeforces.com/problemset/problem/305/B​​大致题意:问是否等于开始直接用浮点递归处理。。。结果可想而知。再一次出现运行结果不一样的问题:对于数据......
  • 开源,跨平台免费C++ IDE ---Code::Block
     CodeBlock是一个免费,开源的C++IDE,它看上去有一个一致的外观,满足用户的需要,具有扩展性和可配置性。这个IDE有你需要的所有功能,并且它是跨平台的。另外,其具有插件框架......
  • leetcode-67-easy
    AddBinary思路一:先计算公共部分,最后补充未计算的位置,模拟二进制加法,写的太丑了publicStringaddBinary(Stringa,Stringb){charONE='0'+'1';char......
  • 用VSCode和CMake编写调试C/C++
    VSCode配置编译任务与调试对象在配置的时候会用到一些vscode的变量,用${}包裹起来的那些。${workspaceFolder}是当前工作空间(或vscode所打开根文件夹)在操作系统中绝对路......
  • LeetCode148. Sort List
    题意链表排序方法递归代码classSolution{public:ListNode*sortList(ListNode*head){returnsortList(head,nullptr);}ListNode*......