Entity Framework使用DBContext實現增刪改查示例
導讀 | 這篇文章介紹了Entity Framework使用DBContext實現增刪改查的方法,文中透過示例程式碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑑價值,需要的朋友可以參考下 |
有一段時間沒有更新部落格了,趕上今天外面下雨,而且沒人約球,打算把最近對Entity Framework DBContext使用的心得梳理一下,早些時候在網上簡單查過,對於最新版本的EF並沒有類似的知識梳理類文章,希望對大家有所幫助。
我為什麼討厭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 ListLodgings { 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 DbSetDestinations { get; set; } public DbSetLodgings { get; set; } public DbSetTTables { get; set; } } }
比如本文的TTable表是在TTT Schema下面的, 而其他表示設計在DBO下面,最方便的方式是使用fluent API, 具體程式碼如請參見 TTableConfiguration Class和 OnModelCreating()方法,可配置的粒度非常細,比如可以配置領域模型和資料庫的哪個Schema的哪張表的哪一列對應,本文是將TTable 類的資料庫表配置為了TTT Schema下的TTable表,
public class TTableConfiguration : EntityTypeConfiguration{ public TTableConfiguration() { this.ToTable("TTable", "TTT"); } }
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)) { IQueryabledest = context.Destinations.Where(a => a.DestinationId == destId); return dest.Single(); } }
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()); } } } }
public static ListQueryPaging(int pageIndex, int pageSize, Expression<1func> whereLambda, Expression<1func> 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進行增刪改查操作給出了詳盡的解釋,並且給出了資料庫和領域模型程式碼分開設計的完整解決方案,同時介紹了手動資料庫表和領域模型對映,資料庫事務實現,分頁查詢等常用功能,希望對大家有所幫助。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2933657/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- .NET Framework 4.8 Web API+Entity Framework(實現增刪改查)FrameworkWebAPI
- Entity Framework Code First使用DbContext查詢FrameworkContext
- AppBox升級進行時 - Entity Framework的增刪改查APPFramework
- Entity Framework Tutorial Basics(7):DBContextFrameworkContext
- 運用layui實現增刪改查UI
- js實現表格的增刪改查JS
- 使用express+mongoose對mongodb實現增刪改查操作ExpressMongoDB
- 使用Mongoose類庫實現簡單的增刪改查Go
- Go實現對MySQL的增刪改查GoMySql
- 單連結串列實現增刪改查
- 封裝模組實現商品增刪改查封裝
- FMDB | 實現資料的增刪改查
- 看Zepto如何實現增刪改查DOM
- rust sqlx 使用---增刪改查RustSQL
- 增刪改查
- Java實現簡單的增刪改查操作Java
- Node.js+Express+Mysql 實現增刪改查Node.jsExpressMySql
- jQuery實現購物車的增刪改查jQuery
- Mybatis-plus實現簡單增刪改查MyBatis
- indexedDB 增刪改查Index
- SQL增刪改查SQL
- mysql增刪改查MySql
- Mongoose查增改刪Go
- FMDB增刪改查
- mysql增查刪改MySql
- koa+mysql實現增刪改查-全棧之路MySql全棧
- webpack4+express+mongodb+vue 實現增刪改查WebExpressMongoDBVue
- 第一個mybatis程式,實現增刪改查CRUDMyBatis
- mybatis實現MySQL資料庫的增刪改查MyBatisMySql資料庫
- JDBC連線mysql-8.0實現增刪改查JDBCMySql
- .NET使用P/Invoke來實現登錄檔的增、刪、改、查功能
- MongoDB——簡單增、刪、改、查實踐MongoDB
- Node+Vue實現對資料的增刪改查Vue
- python 連線mongodb實現增刪改查例項PythonMongoDB
- 關於ToDolist 的增刪改查 用jQuery來實現jQuery
- express+mongodb+vue實現增刪改查-全棧之路ExpressMongoDBVue全棧
- 用jsp實現資料庫的增刪改查JS資料庫
- layui的增刪改查UI