동일한 데이터에서를 사용하여 구현 데이터베이스 마이그레이션 로그 Asp.net 핵심 사용자 정의 멀티 테넌트 (multi-tenant) 데이터베이스의 EF 코어를 구현 (1) Asp.net 코어 구조의 사용으로 달성 EF 코어 멀티 테넌트 (multi-tenant) 데이터를 사용하여 EF 코어 (코드 첫 번째) 업데이트 다중 사용자 (2)의 분리 테이블

머리말

실제로 발생하는 경우 멀티 테넌시 (multi-tenancy)를 달성하기 위해 EF 핵심 문제를 썼다 때문에 그 이유는이 문서를 작성합니다.

특정 기사 링크 :

Asp.net 코어 멀티 - 테넌트 데이터로부터 EF 코어 (1)를 사용하여 달성

Asp.net 코어 EF 코어에서 다중 사용자의 데이터를 사용하여 달성 된 (2) : 표 분리    (주로 관련 층)

여기에 발생하는 주요 문제 I는 다음과 같습니다 멀티 테넌트 (multi-tenant) 테이블이 동일한 데이터베이스를 사용하기 때문에. 이 때문에,하지 Database.EnsureCreated ()에 의해 자동으로 여러 동일한 구조이지만 테이블의 다른 이름을 생성한다.

일부 멀티 테이블을 생성하는 스크립트를 실행해야하므로 그래서, 본문에서 언급했다.

난 여전히 SQL 관리 테이블을 사용하여 생각하는 동안 멀티 테넌트 (multi-tenant)의 경우보다 신뢰할 수있는 솔루션이지만, EF 코어 네이티브에서 제공하는 마이그레이션 메커니즘을 사용할 수있는 경우 자동으로 더 친절 런타임에 데이터 테이블 구조를 생성하고 업데이트합니다.

 

아이디어의 실현

사실, 우리 모두 알고, EF 코어 (코드 첫 번째는) 여기에, 데이터베이스에 __EFMigrationHistory에게 데이터베이스 레코드의 버전을 유일한 테이블을 생성합니다.

동시에 여러 세입자가 있기 때문에 기사 시나리오에서는, 같은 테이블 구조 (제품) 동시에 데이터 테이블 임차인의 여러 버전을 녹음 할 수있는 __EFMigrationHistory 의미, 여러 번 나타납니다.

주요 이슈는 이미 알고 글쎄, 우리가 여기 계시 답을 넣을 수 실현 다음 자세히 질문 :

상점 만들기 및 MigrationHistory 테이블의 상점 2가되었지만 그림 당신은 우리의 사용자 정의 MigrationHistory 테이블을 참조하고 다음 데이터 수 있습니다.

 

 

 

구현

프로젝트

이것은 특히 거주자에 따라, 동일한 테이블은 모든 데이터를 작성하는 다중 사용자 시스템이다.

 

프로젝트 종속 관계 :

1. .NET의 핵심 응용 프로그램 3.1. 시스템에 설치된 닷넷 핵심 SDK 버전 3.1

2. MySQL의. Pomelo.EntityFrameworkCore.MySql 사용 패키지

3. EF 코어, Microsoft.EntityFrameworkCore, 버전 3.1.1. EF core3.0는 .NET 표준 2.1이기 때문에 여기에서 우리는 3.1을 사용해야합니다.  

4. EF 코어 디자인, Microsoft.EntityFrameworkCore.Design, 버전 3.1.1

5. DOTNET-EF 도구, 버전 3.1.1

 

주요 목적 :

1. MigrationsAssembly, 대응하는 이전의 생성을 달성하기 위해 이러한 장치를 사용.

2. 마이그레이션 파일은 여기가 DOTNET-EF 명령의 구현을 사용하여 마이그레이션 관련 파일의 그룹을 의미 실제로 데이터베이스를 생성하고 업데이트 할 수있는 특정 파일을 생성합니다.

 

구현 단계

1. 실행 DOTNET-EF 명령은 마이그레이션 파일을 생성합니다

명령 :

1 DOTNET - EF 마이그레이션은 추가 초기화

실행 후 프로젝트 폴더에있는 것 마이그레이션 파일은 실제로 그들이 실행 C #을 객체가 더 * .cs 파일을 생성합니다

기관은 다음과 같습니다 :

 

 

이 세 가지 문서가이 파일의 주요 기능은 * _init.cs입니다

개봉 후 우리는 수정이 그를 필요

1  사용 Microsoft.EntityFrameworkCore.Metadata;
2  사용 Microsoft.EntityFrameworkCore.Migrations;
(3)  
(4)  스페이스 kiwiho.Course.MultipleTenancy.EFcore.Api.Migrations
 5  {
 6      공용 부분 클래스 INIT : 마이그레이션
 7      {
 8          개인 읽기 전용 문자열 프리픽스;
9          공용 INIT (문자열 접두어)
 10          {
 11 일              경우 (string.IsNullOrEmpty (접두사))
 12              {
 13                  스로인 새로운 System.ArgumentNullException ();
14              }
 15             this.prefix = 프리픽스;
16          }
 17  
18          보호 오버라이드 최대 공극 (MigrationBuilder migrationBuilder)
 19          {
 20              migrationBuilder.CreateTable (
 21                  이름 : 접두사 + "_Products"
 22 개                  컬럼 : 테이블  => 새로운
 23                  {
 24                      이드 =  테이블 . < INT > (널 : FALSE를 )
 25                         .Annotation ( "MySQL의 : ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
 26=  테이블 . < 문자열 > (최대 길이 : 50 , 널 (NULL) : false)를,
 27                      종류 =  테이블 . < 문자열 > (최대 길이 : 50 , 널 (NULL) : TRUE),
 (28)                      가격 =  테이블 . < 더블 > (널 (NULL) : TRUE)
 (29)                  },
30 개                  제약 : 테이블  => 
31                  {
 32                       .PrimaryKey ( "PK__Products"X => x.Id);
33                  });
34          }
 35  
36          보호 오버라이드 공극 하 (MigrationBuilder migrationBuilder)
 37          {
 38              migrationBuilder.DropTable (
 39                  이름 : 접두사 + "_Products");
40          }
 41      }
 42 }
초기화 마이그레이션

다음은 주요 변경 사항은 다음과 같습니다

 1.1 생성자를 추가하고 접두사 매개 변수의 내부를 추가 할 수 있습니다.

 1.2 접속 방법 테이블 이름 수정 변수 _product 앞에 프리픽스를 추가 (라인 21)

 1.3 아래의 방법, 테이블 이름 수정, 변수 _product 앞에 접두사를 추가 (라인 39)

 

MigrationByTenantAssembly 파일을 작성합니다.

이전 TELL 마이그레이션 파일 생성자가 변경 때문에, 이론적으로 EF 코어는 성공적으로 기본 방법으로 다섯 개 법률 변화 마이그레이션 파일을 실행 한

1  이용 시스템;
(2)  사용 하는 System.Reflection 단계;
(3)  사용 Microsoft.EntityFrameworkCore 단계;
4  사용 Microsoft.EntityFrameworkCore.Diagnostics;
5  이용 Microsoft.EntityFrameworkCore.Infrastructure 단계;
6  이용 Microsoft.EntityFrameworkCore.Migrations;
7  사용 Microsoft.EntityFrameworkCore.Migrations.Internal 단계;
8  
9  네임 스페이스 kiwiho.Course.MultipleTenancy.EFcore.Api.Infrastructure
 10  {
 11 개      대중  클래스 MigrationByTenantAssembly : MigrationsAssembly
 (12)     {
 13          전용  판독 전용 DbContext 컨텍스트;
14  
15          공중 MigrationByTenantAssembly (ICurrentDbContext currentContext,
 16                IDbContextOptions 옵션 IMigrationsIdGenerator idGenerator,
 17                IDiagnosticsLogger <DbLoggerCategory.Migrations> 기록 장치)
 18            : 베이스 (currentContext, 옵션 idGenerator, 로거)
 19          {
 20              콘텍스트 = currentContext.Context;
21          }
 22  
(23)          공공  재정의마이그레이션 CreateMigration (소속 카테고리 migrationClass,
 24                문자열 activeProvider)
 25          {
 26              경우 (activeProvider == null이 )
 27                  던져  새로운 경우 ArgumentNullException이 ($는 " {nameof (activeProvider가)} 인수가 null " );
28  
29              VAR hasCtorWithSchema = migrationClass
 30                      .GetConstructor ( 새로운 [{ 대해서 typeof ( 문자열 )})! = null을 ;
(31)  
(32)              의 경우 (hasCtorWithSchema && 문맥ITenantDbContext tenantDbContext)
 33              {
 34                  VAR의 인스턴스 = (마이그레이션) Activator.CreateInstance로 (migrationClass.AsType () tenantDbContext .TenantInfo? .NAME);
35                  instance.ActiveProvider = activeProvider;
36                  반환 인스턴스;
37              }
 38  
39              복귀  베이스 .CreateMigration (migrationClass, activeProvider);
40          }
 41      }
 42 }
MigrationByTenantAssembly

 

아무것도 특수 키는 29 ~ 37 선이다,이 클래스에 있습니다. 대상 객체 마이그레이션 생성자 매개 변수와 하나의 문자열 유형이 있는지 여부를 결정하기 위해 먼저 필요

DbContext가 ITenantDbContext 인터페이스를 달성하기가 있는지 확인하십시오.

마이그레이션 인스턴스 (생성자에 세입자 이름 패스) 활성제를 사용하여 만든

 

3. AddDatabase MultipleTenancyExtension 클래스, 추가 사용자 정의 테이블의 방법 MigrationHistory

1  VAR dbOptionBuilder = options.UseMySql (resolver.GetConnection (), 빌더 =>
 2-  {
 3      경우 (option.Type == ConnectionResolverType.ByTabel)
 -4-      {
 5          builder.MigrationsHistoryTable ($ {} tenantInfo.Name EFMigrationsHistory __ " ); 
6      }
 7  })
 8  
9  
10 dbOptionBuilder.ReplaceService <Microsoft.EntityFrameworkCore.Migrations.IMigrationsAssembly, MigrationByTenantAssembly> ();

가장 중요한 포인트는 다섯 번째 줄입니다, MigrationsHistoryTable이 MigrationHistory 테이블을 설정 전화

또 다른 점은 MigrationByTenantAssembly와 기본 구현 EF 코어 (IMigrationsAssembly 인터페이스) 형식을 대체 라인 10

 

다음 ProductController 생성자 4. 개질

Database.Migrate의 주요 역할은 그것을 만들고 실행시에 데이터베이스를 업데이트하도록 구현 될 수 있습니다

1  공용 ProductController (StoreDbContext storeDbContext)
 2  {
 3       .storeDbContext = storeDbContext;
4      .storeDbContext.Database.Migrate ();
5 }

 

 

결과보기

호출 인터페이스

일련의 기사처럼, 우리는 첫 번째 통화는 제품의 인터페이스는 상점 만들기 기록 및 상점 2에 추가 된 만듭니다.

다음은 상점 만들기의 결과입니다

 

상점 2 쿼리 결과

 

 

 

 데이터를 확인하기 위해 데이터베이스를 확인

데이터베이스 테이블 구조

 

 

store1_Products 테이블 데이터

 

 

store2_Products 테이블 데이터

 

 

 

개요

이 문서에서 우리는 코드 첫 번째 모드에서 EF 코어 데이터베이스를 업데이트하는 방법을 설명하고, 생성자 마이그레이션 객체를 추가하여, 자신의 필요한 매개 변수를 추가합니다.

IMigrationsAssembly 구현 기본값을 대체하여 EF 코어는 사용자 정의 개체의 MigrationByTenantAssembly 마이그레이션이 인스턴스화됩니다.

기본 EF 코어는 궁극적으로 요구 MigrationHistory 교체합니다.

 

이 문서는 단지 예이지만,하지만 그것을 달성하기 위해 실제 프로젝트의 요구에 같은 도구를 사용할 수 있습니다. 하지만 다시, 멀티 테넌트 (multi-tenant)의 경우에, 내가 먼저 모드 DB를 사용하는 것이 좋습니다.

 

코드에 대한

코드는 github에 전달되어, 지점 코드 EF_code_first를 참조하십시오.

https://github.com/woailibain/EFCore.MultipleTenancyDemo/tree/EF_code_first

 

 

추천

출처www.cnblogs.com/woailibian/p/12319369.html