Entity Framework使用DBContext實現增刪改查示例

大雄45發表於2023-02-06
導讀 這篇文章介紹了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 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; }
    }
}
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))
    {
        IQueryabledest = 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 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章