日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
asp.netcore中怎么定義數(shù)據(jù)訪問(wèn)層

asp.net core中怎么定義數(shù)據(jù)訪問(wèn)層,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)業(yè)提供淮濱企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為淮濱眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

1. 數(shù)據(jù)實(shí)體

通常情況下,一個(gè)項(xiàng)目的數(shù)據(jù)實(shí)體中字段并不是完全沒(méi)有規(guī)律可尋。通常情況下,必須有一個(gè)主鍵。有些時(shí)候,會(huì)要求在數(shù)據(jù)表中增加上次修改時(shí)間和創(chuàng)建時(shí)間,以及創(chuàng)建人和修改人的主鍵。

所以,我們可以創(chuàng)建一個(gè)泛型父類(lèi),來(lái)幫我們定義這些公共字段:

using System;

namespace Data.Infrastructure
{
   public class BaseEntity
   {
       public T Id { get; set; }

       public string ModifyUserId { get; set; }

       public DateTime? ModifyTime { get; set; }


       public string CreatorId { get; set; }
       public DateTime? CreateTime { get; set; }
   }
}
 

看上述代碼里,命名空間并不在Data里,而是在Data.Infrastructure里。這個(gè)命名空間 Infrastructure 用來(lái)存放一些項(xiàng)目的架構(gòu)類(lèi)或者接口,里面還會(huì)其他的類(lèi)。

那么,給這個(gè)類(lèi)補(bǔ)充一些可能有用的方法:

public void Create(object userId)
{
   CreatorId = userId.ToString();
   CreateTime = DateTime.Now;
}

public void Create(object userId, DateTime createTime)
{
   CreatorId = userId.ToString();
   CreateTime = createTime;
}

public void Modify(object userId)
{
   ModifyUserId = userId.ToString();
   ModifyTime = DateTime.Now;
}

public void Modify(object userId, DateTime modifyTime)
{
   ModifyUserId = userId.ToString();
   ModifyTime = modifyTime;
}
 

這里用來(lái)保存用戶(hù)ID的字段,我都用了字符串做保存,是借用字符串類(lèi)型保存數(shù)據(jù)時(shí)能容納更多的數(shù)據(jù)類(lèi)型。

 

2. 常見(jiàn)數(shù)據(jù)操作接口

在正常開(kāi)發(fā)中,一個(gè)完整的數(shù)據(jù)操作接口會(huì)有很多分類(lèi),但是很多時(shí)候我們需要分開(kāi)增刪改和查詢(xún)這兩種操作。對(duì)于數(shù)據(jù)庫(kù)而言,視圖和有些數(shù)據(jù)表都是不被允許改變的,這時(shí)候就需要我們只對(duì)調(diào)用方開(kāi)放查詢(xún)接口,而不開(kāi)放修改接口。

所以,在Domain下應(yīng)該有以下兩個(gè)接口:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Domain.Infrastructure
{
   ///
   /// 修改接口
   ///

   ///
   public interface IModifyRepository
   {
       ///
       /// 插入數(shù)據(jù)
       ///

       ///
       ///
       T Insert(T entity);
       ///
       /// 插入數(shù)據(jù)
       ///

       ///
       void Insert(params T[] entities);
       ///
       /// 插入數(shù)據(jù)
       ///

       ///
       void Insert(IEnumerable entities);
       ///
       /// 保存已提交的修改
       ///

       ///
       void Update(T entity);
       ///
       /// 保存已提交的修改
       ///

       ///
       void Update(params T[] entities);
       ///
       /// 更新數(shù)據(jù)
       ///

       ///
       ///
       void Update(Expression> predicate, Expression> updator);
       ///
       /// 刪除
       ///

       ///
       void Delete(T entity);
       ///
       /// 刪除數(shù)據(jù)
       ///

       ///
       void Delete(params T[] entities);
       ///
       /// 根據(jù)條件刪除數(shù)據(jù)
       ///

       ///
       void Delete(Expression> predicate);
       ///
       /// 刪除主鍵對(duì)應(yīng)的數(shù)據(jù)
       ///

       ///
       void DeleteByKey(object key);
       ///
       /// 刪除主鍵對(duì)應(yīng)的數(shù)據(jù)
       ///

       ///
       void DeleteByKeys(params object[] keys);
   }
}
 

上述是更新接口,那么我們回過(guò)頭來(lái)寫(xiě)查詢(xún)接口,查詢(xún)接口的方法有很多。我們先創(chuàng)建一個(gè)接口文件:

using System;
using System.Linq.Expressions;

namespace Domain.Infrastructure
{
   ///
   /// 查詢(xún)接口
   ///

   ///
   public interface ISearchRepository
   {

   }
}
 

一個(gè)查詢(xún)接口應(yīng)該包括以下方法:

  • 獲取單個(gè)數(shù)據(jù)

/// 
/// 根據(jù)主鍵獲取數(shù)據(jù)
///

///
///
T Get(object key);
///
/// 查詢(xún)
///

///
///
T Get(Expression> predicate);
 
  • 統(tǒng)計(jì)數(shù)量:

/// 
/// 返回?cái)?shù)據(jù)庫(kù)中的數(shù)據(jù)條目
///

///
int Count();
///
/// 返回?cái)?shù)據(jù)庫(kù)中的數(shù)據(jù)條目,類(lèi)型為L(zhǎng)ong
///

///
long LongCount();
///
/// 返回符合條件的數(shù)據(jù)數(shù)目
///

///
///
int Count(Expression> predicate);
///
/// 返回長(zhǎng)整形的符合條件的數(shù)目
///

///
///
long LongCount(Expression> predicate);
 
  • 存在性判斷

/// 
/// 是否存在滿(mǎn)足條件的數(shù)據(jù)
///

///
///
bool IsExists(Expression> predicate);
 
  • 查詢(xún)

// 
/// 返回?cái)?shù)據(jù)庫(kù)中所有記錄
///

///
List Search();
///
/// 返回所有符合條件的數(shù)據(jù)
///

///
///
List Search(Expression> predicate);
///
/// 返回一個(gè)延遲查詢(xún)的對(duì)象
///

///
IEnumerable Query();
///
/// 返回一個(gè)延遲查詢(xún)的對(duì)象,并預(yù)設(shè)了一個(gè)查詢(xún)條件
///

///
///
IEnumerable Query(Expression> predicate);
 
  • 排序

/// 
/// 排序查詢(xún),默認(rèn)升序
///

///
///
///
///
List Search

(Expression> predicate, Expression> order);
///


/// 排序查找,指定是否降序排列
///

///
///
///
///
///
List Search

(Expression> predicate, Expression> order, bool isDesc);

 
  • 分頁(yè)

實(shí)際上分頁(yè)的接口定義模型需要兩個(gè)類(lèi)的輔助,如果沒(méi)有這兩個(gè)類(lèi),接口的定義會(huì)變得十分復(fù)雜,不利于代碼的可讀性:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace Data.Infrastructure
{
   ///
   /// 分頁(yè)條件模型
   ///

   ///
   public class PageCondition
   {
       ///
       /// 查詢(xún)條件
       ///

       ///
       public Expression> Predicate { get; set; }
       ///
       /// 排序字段
       ///

       ///
       public string OrderProperty { get; set; }

       ///
       /// 升序排序或者降序排序,升序?yàn)?asc或者空,降序?yàn)閐esc
       ///

       ///
       public string Sort{get;set;}
       ///
       /// 每頁(yè)最大數(shù)據(jù)容量
       ///

       ///
       public int PerpageSize { get; set; }
       ///
       /// 當(dāng)前頁(yè)
       ///

       ///
       public int CurrentPage { get; set; }
   }
   ///
   /// 分頁(yè)結(jié)果
   ///

   ///
   public class PageModel
   {
       ///
       /// 數(shù)據(jù)
       ///

       ///
       public List Items { get; set; }
       ///
       /// 當(dāng)前頁(yè)碼
       ///

       ///
       public int CurrentPage { get; set; }
       ///
       /// 每頁(yè)最大數(shù)據(jù)容量
       ///

       ///
       public int PerpageSize { get; set; }
       ///
       /// 查詢(xún)數(shù)據(jù)總數(shù)
       ///

       ///
       public long TotalCount { get; set; }
       ///
       /// 總頁(yè)碼
       ///

       ///
       public int TotalPages { get; set; }
   }
}
 

這是兩個(gè)輔助類(lèi),可以簡(jiǎn)單看一下如果這些參數(shù)不進(jìn)行封裝直接傳給方法,可以預(yù)見(jiàn)方法的參數(shù)列表會(huì)特別長(zhǎng),這對(duì)于可讀性和可維護(hù)性來(lái)說(shuō)簡(jiǎn)直就是災(zāi)難。我曾經(jīng)接手過(guò)一個(gè)項(xiàng)目的維護(hù),上一位開(kāi)發(fā)者在一個(gè)方法寫(xiě)了近15個(gè)參數(shù),而且還有大量的可選參數(shù),嗯,十分頭疼。所以,我不建議大家這樣寫(xiě),一個(gè)方法參數(shù)超過(guò)4個(gè)我建議還是封裝一下。

那么,看一看方法的聲明:

/// 
/// 根據(jù)分頁(yè)參數(shù)設(shè)置,進(jìn)行分頁(yè)查詢(xún)
///

///
///
PageModel Search(PageCondition condition);

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


當(dāng)前名稱(chēng):asp.netcore中怎么定義數(shù)據(jù)訪問(wèn)層
轉(zhuǎn)載來(lái)于:http://www.dlmjj.cn/article/gspghc.html