>  기사  >  백엔드 개발  >  Entity Framework 사용자 지정 페이징 효과의 구현 방법을 자세히 설명합니다.

Entity Framework 사용자 지정 페이징 효과의 구현 방법을 자세히 설명합니다.

巴扎黑
巴扎黑원래의
2017-08-06 10:53:071533검색

이 글은 주로 Entity Framework를 기반으로 한 사용자 정의 페이징 효과, 추가, 삭제 및 수정의 일반적인 구현을 자세히 소개합니다. 관심 있는 친구는

소개

를 참조하세요. 페이징 전에 작성하세요. Dapper 기반 구현을 이제 Entity Framework 기반의 페이징 구현과 추가, 삭제 및 수정의 범용 구현을 작성해 보겠습니다.

Code

예제 실행 방법

은 이전과 동일합니다.

1 먼저 코드를 복제하고 Database

2에서 Database.7z의 압축을 풉니다. SQL Server의 LocalDB를 사용하지 않는 경우 App.Config에서 연결 문자열을 변경해야 합니다.

3. Ctrl + F5를 눌러 샘플 프로그램을 실행하세요.

Repository 기본 클래스 - 쿼리

CommonAbstractRepository.cs는 다음과 같은 추가, 삭제, 수정 및 확인 방법을 구현하는 Repository의 기본 클래스입니다.


public virtual Tuple<IEnumerable<T>, int> Find(Expression<Func<T, bool>> criteria
      , int pageIndex
      , int pageSize
      , string[] asc
      , string[] desc
      , params Expression<Func<T, object>>[] includeProperties)

이 방법은 다음과 같습니다. 사용자 정의 페이징 쿼리에 사용되는 AbstractRepository의 쿼리 메서드 중 하나입니다. 여기서 조건은 표현식이고 pageIndex, pageSize, asc, desc 매개변수는 페이징 관련 매개변수입니다.

다중 테이블(연관 테이블)에 대하여; :

includeProperties는 다중 테이블 시간에 있으며 관련 테이블을 조인합니다. EF는 기본적으로 지연 로드를 사용하므로 관련 테이블은 기본적으로 즉시 로드되지 않으므로 코드를 작성할 때 주의하지 않으면 for 루프에서 n 단어 테이블을 반복할 수 있습니다. 쿼리 중에 관련 테이블을 조인하려면 includeProperties 매개 변수를 사용하세요.

Repository 기본 클래스 - 추가, 삭제 및 수정

AbstractRepository는 제네릭을 사용하여 추가, 삭제 및 수정 방법을 구현했습니다.

public virtual T Create(T 엔터티)
public virtual T Update(T 엔터티)
public virtual T CreateOrUpdate(T 엔터티)
public virtual void Delete(TId id)

또한 트랜잭션 구현과 관련하여 다중 저장소가 DBContext를 공유하는 방식을 사용했습니다. CommonUnitOfWork에서 찾으세요. .cs.

UOW를 호출할 때 기본적으로 다음과 유사합니다.


var uow = new EFUnitOfWork();
var repo = uow.GetLogRepository();

repo.Create(new Log
{
  LevelId = 1,
  Thread = "",
  Location = "Manual Creation",
  Message = "This is manually created log.",
  CreateTime = DateTimeOffset.Now,
  Date = DateTime.Now
});

uow.Commit();

UnitOfWork에서 하나 이상의 저장소를 가져오고, DBContext를 공유하고, 추가, 삭제 및 수정 작업을 수행하고, 마지막으로 uow는 SaveChanges를 통합합니다.

Repository의 파생 클래스

이미 AbstractRepository가 있기 때문에 추가, 삭제, 수정, 확인 등의 여러 메소드가 구현되어 있으므로 샘플 프로젝트의 LogRepository와 같은 파생 클래스는 기본적으로 매우 단순해지고 주로 구현될 수 있습니다. 일부 특정 비즈니스 로직, 샘플 프로젝트에는 특별한 비즈니스 로직이 없기 때문에 매우 간단합니다.


public class LogRepository : AbstractRepository<Log, int>
  {
    public LogRepository(EFContext context)
      : base(context)
    {
    }
  }

엔티티 생성 정보

저는 데이터베이스 우선 구현을 선호하고, 데이터베이스를 먼저 디자인합니다. 그런 다음 edmx 리버스 엔지니어링을 사용하여 POCO를 생성합니다. Entity 디렉터리에서 관련 파일을 참조할 수 있습니다.

물론 Code First가 마음에 든다면 문제가 없으며 이 문서의 구현이 여전히 적용됩니다.

로깅 로그를 사용하여 EF SQL 추적

Entity Framework를 사용할 때 EF에서 생성된 SQL에 주의를 기울이는 것이 가장 좋습니다. 그러면 개발 단계에서 잠재적인 성능 문제를 발견하고 작업에 압도되는 것을 피할 수 있습니다. 프로덕션 환경 :)

CommonEFContext.cs에는 EnableTraceSql 구성 항목이 있습니다. true인 경우 EF에서 생성된 SQL이 nlog에 기록됩니다. 데이터베이스에 nlog 로그를 구성했습니다. 즉, 샘플 프로젝트를 실행하면 쿼리할 때마다 새로운 로그 기록이 추가되며, 내용은 쿼리 중에 생성된 SQL입니다.

Specification Pattern

에서 쿼리 메서드에는 ISpecification 예제가 많이 적용됩니다. 이 구현은 다른 사람이 호출하도록 작성된 인터페이스의 경우 쿼리 매개변수를 명확하게 결정할 수 있습니다.


public class LogSearchSpecification : ISpecification<Log>
  {
    public string LevelName { get; set; }
    public string Message { get; set; }
    public Expression<Func<Log, bool>> ToExpression()
    {
      return log => (log.Level.Name == LevelName || LevelName == "") &&
             (log.Message.Contains(Message) || Message == "");
    }

    public bool IsSatisfiedBy(Log entity)
    {
      return (entity.Level.Name == LevelName || LevelName == "") &&
          (entity.Message.Contains(Message) || Message == "");
    }
  }

그런 다음, query method 코드를 보면 내 쿼리 조건이 LevelName과 Message라는 것을 확실히 알 수 있습니다. LevelName이 같고 Message가 Like인 경우 잘 캡슐화되어 있는 LogSearchSpeficiation에 구현되어 있습니다.

드디어

이 구현 세트는 지난 몇 년 동안 천천히 축적되어 실행되었으므로 특정 참조로 사용해야합니다. 물론 특정 프로젝트에서는 일부 DI를 사용하여 얻을 수 있습니다. Repository 등은 이 글의 범위에 속하지 않습니다. 자유롭게 플레이하셔도 좋습니다. 감사합니다.

위 내용은 Entity Framework 사용자 지정 페이징 효과의 구현 방법을 자세히 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.