.NET Entity FramWork의 Caché Globals와 함께 작업하는 LINQ API
## 소개 "Globals EF"는 잘 알려진 데이터베이스 인터 시스템 캐시에 대한 객체/관계형 매핑 (O/RM) 프레임 워크입니다. 아시다시피, Caché 데이터베이스는 매우 효율적인 다차원 데이터 엔진으로 구동됩니다. 노출 된 인터페이스는 다차원 구조에 대한 액세스를 지원하여 최고 성능과 가장 큰 저장 가능성을 제공합니다. Caché는 "빅 데이터"와 함께 작동하는 응용 프로그램에 매우 유용하며 요즘에는 이러한 응용 프로그램이 점점 더 많습니다. C# 프로그래밍 언어가 포함 된 .NET Framework는 개발자가 응용 프로그램 생성 및 유지 관리를 매우 쉽게 만들 수 있습니다. 따라서 .NET 응용 프로그램에서 Intersystems Caché를 쉽게 사용하는 것이 실제 작업입니다. Intersystems는 .NET 애플리케이션에서 Globals API에 액세스 할 수있는 Caché Extreme 기술을 제공하지만 애플리케이션을 만드는 것은 여전히 시간이 많이 걸립니다. 따라서 Globals EF의 주요 목적은 Caché 및 GlobalsDB와의 작업을 용이하게하는 것입니다. 이 프레임 워크의 핵심은 Intersystems Caché Extreme Technology입니다. 설명 된 프레임 워크는 객체/관계형 매핑, LINQ에서 Globals와 같은 많은 유용한 기능을 제공하며 Caché 및 GlobalSDB와의 상호 작용을 간단하고 원활하게합니다.
##설치
## 공개 API
#### dbset 클래스
DbSet<TEntity> 클래스는 작업을 작성, 읽기, 업데이트 및 삭제하는 데 사용되는 엔티티를 나타냅니다.
이 클래스는 IOrderedQueryable<TEntity> 및 IQueryProvider 인터페이스를 구현하므로 DbSet<TEntity> 인스턴스에서 LINQ 표현식을 사용하여 데이터베이스에서 데이터를 얻을 수 있습니다. IOrderedQueryable<TEntity> 의 구현으로 인해 OrderBy, OrderByDescending, WathBy 또는 thenBydescending과 같은 정렬 쿼리를 사용할 수도 있습니다.
클래스 dbset은 또한 다음 방법을 선언하는 IDbSet<TEntity> 인터페이스를 구현합니다.
void InsertOnSubmit ( TEntity entity ) ;
void InsertAllOnSubmit ( IEnumerable < TEntity > entities ) ;
void UpdateOnSubmit ( TEntity entity ) ;
void UpdateAllOnSubmit ( IEnumerable < TEntity > entities ) ;
void DeleteOnSubmit ( TEntity entity ) ;
void DeleteAllOnSubmit ( IEnumerable < TEntity > entities ) ; 이러한 방법은 데이터로 해당 작업을 수행하는 데 사용할 수 있습니다. 단일 엔티티 또는 엔티티 세트를 조작 할 수 있습니다.
#### 텐트
이전에 설명 된 클래스의 일반 매개 변수 ( DbSet<TEntity> )는 데이터베이스에 저장 해야하는 엔티티를 나타냅니다. 텐트에 대한 제한 - 대중으로 선언 된 수업이어야합니다.
이 수업에서는 엔티티에 해당하는 공개 속성을 선언 할 수 있습니다.
데이터베이스에서는 다음 요구 사항을 충족하는 속성 만 저장했습니다.
#### columnAttribute
ColumnAttribute 이 속성이 데이터베이스에 저장되어야한다는 것을 나타내는 엔터티의 속성에 적용될 수 있습니다.
ColumnAttribute 에는 다음 속성이 포함됩니다.
public string Name { get ; set ; } 엔티티 (열)의 속성은 예를 들어 짧은 다른 이름의 데이터베이스에 저장되어야 함을 나타냅니다. 값이 제공되지 않으면 엔티티 클래스에서 속성 이름을 사용합니다. 예를 들어,이 경우
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } 속성은 "ID"로 저장 되며이 경우
[ Column ( Name = "Id" ) ]
public int IdentificationNumber { get ; set ; } "식별 번호"로.
public bool IsPrimaryKey { get ; set ; } 열이 기본 키임을 나타냅니다. ColumnAttribute ( IsPrimaryKey 속성을 true로 설정 함)를 여러 열에 적용하여 복잡한 기본 키를 설명 할 수 있습니다. 프레임 워크는 기본 키를 관리하고 GlobalsDbException ( "기본 키 제한 조건 위반. 중복 키를 삽입 할 수 없음")을 동일한 기본 키를 삽입하려고합니다.
public bool IsDbGenerated { get ; set ; } 기본 키 열이 ID, 즉 프레임 워크에 의해 생성 된 ID임을 나타냅니다. 정수 유형 ( Int16 , Int32 및 Int64 ) 만 지원합니다.
엔티티에 ColumnAttribute 적용하기위한 몇 가지 규칙이 있습니다.
ColumnAttribute 의 IsPrimaryKey 속성으로 하나 이상의 기본 키를 선언해야합니다.DbGenerated 열로 지원되는 적분 유형 ( short , int 또는 long ) 만DbGenerated 컬럼 만 허용됩니다DbGenerated 기본 키 또는 사용자 정의 기본 키가 허용됩니다. 이러한 규칙이 충족되지 않으면 EntityValidationException 발생합니다. 엔티티에 ID 키가 있으면 프레임 워크가이를 생성하고 엔티티를 데이터베이스에 삽입하고 ID 키로 표시된 열로 값을 설정합니다.
#### dbsetattribute
dbsetattribute는 Tentity 클래스에 적용 할 수 있습니다. 이 속성은 하나의 속성 만 설명합니다
public string Name { get ; set ; }Globals 데이터베이스의 Global for Entity에는 다른 이름이 있어야합니다. ColumnAttribute에서 동일한 속성과 유사한 사용.
텐시 클래스에 DbSetAttribute 적용하는 것은 필수가 아닙니다.
#### DataContext
데이터베이스에 대한 연결을 제공하는 초록 클래스. 데이터베이스 데이터에 액세스하기 위해 DbSet<TEntity> 공개 속성 또는 필드 세트로 파생 클래스를 만들어야합니다.
선언 된 공개 메소드 SubmitChanges() DbSet<TEntity> 클래스 ( InsertOnSubmit(TEntity entity) 등)의 공개 메소드와 함께 사용한 데이터베이스를 사용하여 모든 변경 사항을 제출합니다.
DataContext 클래스에는 두 개의 보호 생성자가 있습니다.
protected DataContext(string namespc, string user, string password)protected DataContext()#### GlobalSdbexception
프레임 워크는 다음과 같은 경우 GlobalsDbexception을 던집니다.
#### entityValidationException
Framework는 고객이 다음 요구 사항을 충족하지 않는 엔티티를 선언했을 때 EntityValidationException 던집니다.
ColumnAttribute 의 IsPrimaryKey 속성으로 하나 이상의 기본 키를 선언해야합니다.DbGenerated 열로 지원되는 적분 유형 ( short , int 또는 long ) 만DbGenerated 컬럼 만 허용됩니다DbGenerated 기본 키 또는 사용자 정의 기본 키가 허용됩니다.## 사용 방법
주로 도메인 모델의 클래스를 선언해야합니다. 이 예에서 도메인 모델은 복잡한 계층 구조를 형성하는 4 개의 엔티티 (국가, 교수, 대학 및 도시)로 구성됩니다. 데이터베이스에 저장 해야하는 엔티티의 모든 속성은 ColumnAttrubute 에 표시되어야합니다.
이 단체는 그런 식으로 선언되었습니다.
public sealed class Country
{
[ Column ( IsPrimaryKey = true ) ]
public string Name { get ; set ; }
[ Column ( ) ]
public Continent Continent { get ; set ; }
[ Column ( ) ]
public bool HasSee { get ; set ; }
[ Column ( ) ]
public List < Town > Towns { get ; set ; }
} public sealed class Town
{
[ Column ( ) ]
public string Name { get ; set ; }
[ Column ( ) ]
public bool IsCapital { get ; set ; }
[ Column ( ) ]
public int Population { get ; set ; }
[ Column ( ) ]
public List < University > Universities { get ; set ; }
} public sealed class University
{
[ Column ]
public string Name { get ; set ; }
[ Column ]
public string Description { get ; set ; }
[ Column ]
public List < Faculty > Faculties { get ; set ; }
} public class Faculty
{
[ Column ( ) ]
public string Name { get ; set ; }
[ Column ]
public string Description { get ; set ; }
} 보시다시피, 모든 국가에는 도시 목록이 포함되어 있으며 모든 도시에는 대학 목록이 포함되어 있으며 모든 대학에는 교수진 목록이 포함되어 있습니다. ColumnAttribute 는 데이터베이스에 저장 해야하는 모든 열에 대해 제공됩니다.
데이터베이스에 국가 엔티티를 저장하려고 할 예정이며 모든 어린이 엔티티는 Caché 데이터베이스의 글로벌로 자동으로 직렬화됩니다. ColumnAttribute 의 규칙에 따르면 엔티티 국가의 기본 키를 선언해야합니다. 그래서 나는 속성 Name 기본 키로 표시했습니다.
국가 실체와 함께 작동하려면 처음에는 파생 된 클래스의 DataContext 생성해야합니다. 둘째, 파생 클래스에서 DbSet<TEntity> 속성을 선언해야합니다. 여기서 Tentity - 데이터베이스에 저장하려는 엔티티 유형. 언급 된 규칙에 따라 TestDataContext 클래스를 선언했습니다. 클래스 TestDataContext 에는 하나의 공공 부동산 Countries 만 있습니다.
또한 보안 자격 증명을 가진 생성자를 호출하는 공개 매개 변수가없는 구성자를 선언했으며 UniversityInfodatacontext를 사용하는 것이 매우 편리 해집니다.
internal class UniversityInfoDataContext : DataContext
{
public TestDataContext ( ) : base ( "SAMPLES" , "TestUser" , "testpassword" ) { }
public DbSet < Country > Countries { get ; set ; }
} 데이터를 조작하기 위해 이전 섹션에서 설명한 DbSet<TEntity> 의 다른 방법을 사용할 수 있습니다. 모든 변경 사항은 컨텍스트의 SubmitChanges 방법이 호출 된 경우에만 적용됩니다.
예를 들어, 데이터베이스에서 새로운 국가 엔티티를 만드는 것은 매우 간단합니다.
internal static void InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
context . Countries . InsertOnSubmit ( entity ) ;
context . SubmitChanges ( ) ;
}
}또한 LINQ 쿼리를 사용하여 데이터베이스에서 데이터를 얻을 수 있습니다. 예를 들어, 하나 이상의 도시를 가진 모든 국가를 얻을 수 있습니다.
internal static List < Country > InsertCountry ( Country entity )
{
using ( var context = new UniversityInfoDataContext ( ) )
{
return context . Countries . Where ( country => country . Towns . Count > 1 ) . ToList ( ) ;
}
}