Repositories.EntityFramework 實現方式

来源:http://www.cnblogs.com/zyrmb/archive/2016/03/17/5289310.html
-Advertisement-
Play Games

今天記錄一下自己的EntityFramework數據訪問層。這裡用通過泛型Repository的方式實現了數據的訪問。先上一張結構圖。 Configuration文件夾裡面的類是全部實體映射類。這些類全部繼承至EntityConfigurationBase類。 EntityConfiguration


今天記錄一下自己的EntityFramework數據訪問層。這裡用通過泛型Repository的方式實現了數據的訪問。先上一張結構圖。

Configuration文件夾裡面的類是全部實體映射類。這些類全部繼承至EntityConfigurationBase類。

EntityConfigurationBase又繼承至 EntityTypeConfiguration類,這是EntityFramework的實體映射基類

 1 using System.Data.Entity.ModelConfiguration;
 2 using System.Data.Entity.ModelConfiguration.Configuration;
 3 
 4 using ZY.Core.Entities;
 5 
 6 namespace ZY.Repositories.EntityFramework
 7 {
 8     /// <summary>
 9     /// 數據實體映射配置基類
10     /// </summary>
11     /// <typeparam name="TEntity"></typeparam>
12     /// <typeparam name="TKey"></typeparam>
13     public abstract class EntityConfigurationBase<TEntity, TKey> : EntityTypeConfiguration<TEntity>, IEntityMapper
14         where TEntity : class
15     {
16         //映射實體添加到數據上下文
17         public void RegistorTo(ConfigurationRegistrar configurations)
18         {
19             configurations.Add(this);
20         }
21     }
22 }
View Code

這裡有個重要的方法就是RegistorTo(ConfigurationRegistrar configurations) 這個方法是將當前實體添加到數據上下文。這樣不用在數據上下文寫每一個實體的映射,將實體與上下文解耦出來了。在OnModelCreating(DbModelBuilder modelBuilder) 方法裡面用到了反射,通過反射將所有實體映射關係添加到數據上下文中。這裡可以優化一下就是,反射的時候可以用緩存。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data.Entity;
 7 using System.Data.Entity.ModelConfiguration.Conventions;
 8 using System.Reflection;
 9 
10 namespace ZY.Repositories.EntityFramework
11 {
12     public class BaseDbContext : DbContext
13     {
14         public BaseDbContext()
15             : base("Default")
16         { }
17 
18         public BaseDbContext(string connectionString)
19             :base(connectionString)
20         { }        
21 
22         protected override void OnModelCreating(DbModelBuilder modelBuilder)
23         {
24             //關閉級聯刪除
25             modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
26             //獲取所有映射實體類
27             IEnumerable<IEntityMapper> entityMappers = GetEntityMappers().Select(type => Activator.CreateInstance(type) as IEntityMapper).ToList();
28 
29             foreach (IEntityMapper mapper in entityMappers)
30             {
31                 mapper.RegistorTo(modelBuilder.Configurations);
32             }
33         }
34 
35         /// <summary>
36         /// 通過反射 獲取所有實體映射對象 優化的做法是保存在緩存中
37         /// </summary>
38         /// <returns></returns>
39         private Type[] GetEntityMappers()
40         {
41             Type[] mapperTypes = Assembly.GetExecutingAssembly().GetTypes()
42             .Where(type => !String.IsNullOrEmpty(type.Namespace))
43             .Where(type => type.BaseType != null && type.BaseType.IsGenericType &&
44             type.BaseType.GetInterface(typeof(IEntityMapper).Name) == typeof(IEntityMapper)).ToArray();
45             return mapperTypes;
46         }
47     }
48 }
View Code

數據遷移用了自動遷移,之前剛剛開始用EF的時候沒有用自動遷移,遇到了很多坑,自從用了自動遷移,就沒有管過遷移的事情了。

 1 using System.Data.Entity.Migrations;
 2 
 3 
 4 namespace ZY.Repositories.EntityFramework.Migrations
 5 {
 6     /// <summary>
 7     /// 自動遷移設置
 8     /// </summary>
 9     public class AutoMigrationsConfiguration : DbMigrationsConfiguration<BaseDbContext>
10     {
11         public AutoMigrationsConfiguration()
12         {
13             AutomaticMigrationsEnabled = true;//自動遷移
14             AutomaticMigrationDataLossAllowed = true;//允許數據丟失
15         }
16     }
17 }
View Code

Repository的代碼在上一篇中已經貼出來了。實現了非同步和同步的方法。

 

後續會將整個代碼放到github上面


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用ASP.NET模版生成HTML靜態頁面並不是難事,主要是使各個靜態頁面間的關聯和鏈接如何保持完整。本文介紹了使用ASP.NET模版生成HTML靜態頁面的五種方案。 ASP.NET模版生成HTML靜態頁面方案1: 你可以用這個函數獲取網頁的客戶端的html代碼,然後保存到.html文件里就可以了。
  • 泛型是CLR和編程語言提供的一種特殊機制,它用於滿足“演算法重用” 。 可以想象一下一個只有操作的參數的數據類型不同的策略模式,完全可以用泛型來化為一個函數。 以下是它的優勢: 這就是為什麼List<T>淘汰了ArrayList的原因,特別是在進行值類型操作時,因為裝箱拆箱過多而差距很大。 約定:泛型
  • 本篇體驗ASP.NET Web API的安全管道。這裡的安全管道是指在請求和響應過程中所經歷的各個組件或進程,比如有IIS,HttpModule,OWIN,WebAPI,等等。在這個管道中大致分兩個階段,一個是驗證階段,另一個是授權階段。在ASP.NET Web API v1版本的時候,安全管道大致
  • 1. 【二進位(0~1)、八進位(0~7)、十進位(0~9)】→十六進位(0~15,10~15→A~F) 101011→1*20+1*21+0*22+1*23+0*24+1*25=1+2+0+8+0+32=43 053→3*80+5*81=3+40=43 0x2B=B*160+2*161=11+32
  • In the previous tutorial you created an MVC application that stores and displays data using the Entity Framework and SQL Server LocalDB. In this tutor
  • 1. 2.Note It's a common practice to implement the repository pattern in order to create an abstraction layer between your controller and the data acce
  • 一、選擇器是什麼 有了jQuery的選擇器,我們幾乎可以獲取頁面上任意一個或一組對象 二、Dom對象和jQuery包裝集 1.Dom對象 JavaScript中獲取Dom對象的方式 Hello World 輸出的結果 2.jQuery包裝集 可以理解為是Dom對象的擴展,在jQuery的世界中所有的...
  • ASP.NET MVC 6:https://docs.asp.net/en/latest/mvc/index.html ASP.NET Core :https://docs.asp.net/en/latest/fundamentals/index.html cli-samples : https:/
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...