首页 > 其他分享 >Entity Framework使用DBContext实现增删改查示例

Entity Framework使用DBContext实现增删改查示例

时间:2023-05-07 09:45:14浏览次数:44  
标签:set get 示例 改查 DBContext context var using public

导读 这篇文章介绍了Entity Framework使用DBContext实现增删改查的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的心得梳理一下,早些时候在网上简单查过,对于最新版本的EF并没有类似的知识梳理类文章,希望对大家有所帮助。

1. 不要Code first, 也不要DB first

我为什么讨厌Code first和DB first呢?首先Code first是先写代码,数据库完全由代码生成,开发阶段尚可,一旦到了产品发布阶段,如果需要添加字段,我们总不能用 visual studio去生产环境上去更新数据库吧,听起来就很可怕。而且另外的一个问题自动是生成的数据库脚本也不可控,还不如自己提前设计好。DB first也好不了哪去,反向转过来的代码包含很多没有用的文件,而且数据库的更新还要重新走Model生成过程,简直无法理解为什么会有这样的设计。说了这么多,怎么解决呢?

数据库和领域模型分开设计,按照对应关系映射字段,使用自定义链接字串,既不使用领域模型生成数据库,也不用数据库生成领域模型,示例代码如下,SQL Code 以 Destinations和TTable表为例:

CREATE TABLE [DBO].[Destinations]
(
    [DestinationId] [int] PRIMARY KEY NOT NULL,
    [Name] [nvarchar](max) NULL,
    [Country] [nvarchar](max) NULL,
    [Description] [nvarchar](max) NULL,
    [Photo] [varbinary](max) NULL
CREATE TABLE [TTT].[TTable]
 
(
 
 [Id] [int] PRIMARY KEY NOT NULL,
 
 [Name] [nvarchar](max) NULL
 
)

Model Class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Model
{
    public class Destination
    {
        public int DestinationId { get; set; }
        public string Name { get; set; }
        public string Country { get; set; }
        public string Description { get; set; }
        public byte[] Photo { get; set; }
        public List Lodgings { get; set; }
    }
 
    public class Lodging
    {
        public int LodgingId { get; set; }
        public string Name { get; set; }
        public string Owner { get; set; }
        public bool IsResort { get; set; }
        public Destination Destination { get; set; }
    }
 
    public class TTable
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

Connect String:

< connectionStrings>
    < add name="BAContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DataAccess.BreakAwayContext;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  < /connectionStrings>

DB Context:

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration;
using Model;
 
namespace DataAccess
{
    public class TTableConfiguration : EntityTypeConfiguration
    {
        public TTableConfiguration()
        {
            this.ToTable("TTable", "TTT");
        }
    }
 
    public class BreakAwayContext : DbContext
    {
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new TTableConfiguration());
        }
 
        public BreakAwayContext(string connString) : base(connString)
        {
        }
        public DbSet Destinations { get; set; }
        public DbSet Lodgings { get; set; }
        public DbSet TTables { get; set; }
    }
}
2. 如果数据库的表的字段和领域模型的字段不对应,如何处理呢?

比如本文的TTable表是在TTT Schema下面的, 而其他表示设计在DBO下面,最方便的方式是使用fluent API, 具体代码如请参见 TTableConfiguration Class和 OnModelCreating()方法,可配置的粒度非常细,比如可以配置领域模型和数据库的哪个Schema的哪张表的哪一列对应,本文是将TTable 类的数据库表配置为了TTT Schema下的TTable表,

public class TTableConfiguration : EntityTypeConfiguration
{
    public TTableConfiguration()
    {
        this.ToTable("TTable", "TTT");
    }
}
3. 增删该查自带事物支持,具体代码如下
public static int Insert()
{
    var destination = new Destination
    {
        Country = "Chs",
        Description = "Chs is the language package",
        Name = "xsss"
    };
    using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString))
    {
        var rt = context.Destinations.Add(destination);
        context.SaveChanges();
        return rt.DestinationId;
    }
}
 
public static void Update(Destination destIn)
{
    using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString))
    {
        var dest = context.Destinations.Where(a => a.DestinationId == destIn.DestinationId).Single();
        dest.Name = destIn.Name;
        context.SaveChanges();
    }
}
 
public static void Delete(int destId)
{
    using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString))
    {
        var destination = new Destination() { DestinationId = destId };
        context.Destinations.Attach(destination);
        context.Destinations.Remove(destination);
 
        context.SaveChanges();
    }
}
 
 
public static Destination Query(int destId)
{
    using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString))
    {
        IQueryable dest = context.Destinations.Where(a => a.DestinationId == destId);
 
        return dest.Single();
    }
}
4. 如果需要多个操作同时成功或者失败,需要手动开启事务,具体代码如下
public static void TransactionOps()
{
    using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString))
    {
        using (var dbContextTransaction = context.Database.BeginTransaction())
        {
            try
            {
                var destination = new Destination
                {
                    Country = "Chs",
                    Description = "Chs is the language package",
                    Name = "xs2s"
                };
 
                var destId = context.Destinations.Add(destination);
 
                context.SaveChanges();
 
                context.Destinations.Attach(destId);
                context.Destinations.Remove(destId);
 
                context.SaveChanges();
 
                dbContextTransaction.Commit();
            }
            catch (System.Exception ex)
            {
                dbContextTransaction.Rollback();
                System.Console.WriteLine(ex.ToString());
            }
        }
    }
}
5. 分页查询是网站设计的常用功能,一个简单的真分页查询方法如下如下所示
public static List QueryPaging(int pageIndex, int pageSize, Expression<func<destination, bool="">> whereLambda, Expression<func<destination, tkey="">> orderBy)
{
    using (var context = new BreakAwayContext(ConfigurationManager.ConnectionStrings["BAContext"].ConnectionString))
    {
        return context.Destinations.Where(whereLambda).OrderBy(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
    }
}

本文对最新版本的Entity Framework进行增删改查操作给出了详尽的解释,并且给出了数据库和领域模型代码分开设计的完整解决方案,同时介绍了手动数据库表和领域模型映射,数据库事务实现,分页查询等常用功能,希望对大家有所帮助。

本文地址:https://www.linuxprobe.com/entity-framework-dbcontext.html

标签:set,get,示例,改查,DBContext,context,var,using,public
From: https://www.cnblogs.com/linuxprobe19/p/17362700.html

相关文章

  • Java获取pdd详情api接口、商品详情、商品描述、宝贝链接获取展示示例
    ​拼多多商品详情就是对拼多多商城中的宝贝的描述了,消费者们在进入到宝贝的详情页面后,可以通过这些描述去了解该款宝贝。其实这样也可以大大的增加商品的转化率。那么它的作用有什么呢?1.突出商品卖点:把商品的特色和突出点写表现出来,很更好的吸引到顾客,让顾客有点击和购买的欲......
  • 电子邮件系统 3----JavaMail POP3接收邮件示例 .
    1./**2.*CrazyItTest3.*使用JavaMail编写接收邮件示例4.*/5.package6.import7.import8.import9.import10.import11.import12.import13.import14.import15./**16.*@authorBillTu(tujiyue/iwtxokhtd)17.*May27,2011[10:04:20PM]18.......
  • 电子邮件系统 2----JavaMail 搜索指定邮件示例
    1./**2.*CrazyItTest3.*使用JavaMail搜索并删除指定邮件示例4.*/5.package6.import7.import8.import9.import10.import11.import12.import13.import14.import15.import16.import17.import18.import19.import20./**21.*@authorBi......
  • Python 脚本部署和发布 Django 应用程序的示例代码及注释
    代码说明:1、在脚本中定义了要部署的Django应用程序名称、Docker镜像名称和标签。2、使用字符串模板定义了KubernetesDeployment和Service的YAML文件。在字符串模板中使用了变量,用于替换实际的值。3、将Deployment和Service的YAML文件保存到本地文件中,并使用kube......
  • ArcGIS Desktop(ArcMap)创建、发布、调用GP服务全过程示例(等高线分析)
    本文以等高线分析为例,使用ArcMap软件,从GP分析服务的创建、发布、调用全过程进行演示。使用ArcGISPro发布GP服务请跳转:ArcGISPro创建、发布、调用GP服务全过程示例(等高线分析)本文示例使用软件:ArcGISDesktop10.3.1ArcGISJSAPI4.16注:阅读本文前需要对ArcGISGP服务,模型构建......
  • Django--数据及字段的增删改查
    字段的增删改查#增pwd=models.IntegerField(verbose_name="密码",null=True)#verbose_name说明;null可以为空is_delete=models.CharField(default=0)#设置为默认值#改直接改代码然后执行数据库迁移命令即可#删注释掉代码然后执行数据库迁移命令即可数据的......
  • ArcGIS Pro创建、发布、调用GP服务全过程示例(等高线分析)
    在之前的文章介绍过使用ArcMap发布GP分析服务,由于ArcGIS后续不在更新ArcMap,改用ArcGISPro,本文对ArcGISPro发布GP分析服务进行说明。本文以等高线分析为例,使用ArcGISPro软件,从GP分析服务的创建、发布、调用全过程进行演示。使用ArcMap发布GP服务请跳转:本文示例使用(因为本人po......
  • STM32单片机引脚要职能配置为输入或者输出模式,并不能像51一样准双向,那么如何进行但总
    如题随便找个端口举例对应的程序为 难道需要写之后立即初始化为输入?然后赶紧读?然后再赶紧初始化为输出?再往外写?是的,还真他妈就是这么傻逼的操作 ......
  • java网络编程示例
    1.clientimportjava.io.*;importjava.net.InetAddress;importjava.net.Socket;publicclassTcpClientDemo{publicstaticvoidmain(String[]args){InetAddressbyName=null;Socketsocket=null;OutputStreamos=null;......
  • 2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。
    2023-05-04:用go语言重写ffmpeg的scaling_video.c示例,用于实现视频缩放(Scaling)功能。答案2023-05-04:这段代码实现了使用libswscale库进行视频缩放的功能。下面是程序的主要流程:1.获取命令行参数,包括输出文件名和目标图像大小。2.解析目标图像大小,生成指定大小的输出文件。3.创建缩......