[SQL] 엔티티 프레임 워크 - 테이블이 존재하는지 확인하는 방법?
SQL엔티티 프레임 워크 - 테이블이 존재하는지 확인하는 방법?
나는 코드 첫 번째 접근 방식으로 엔티티 프레임 워크를 사용하고 있습니다. 기본 클래스 DbContext 생성 및 삭제 데이터베이스뿐만 아니라 그 존재를 확인하는 기능이 있습니다.
나는 특별한 테이블 (실체) 기존 여부되어 있는지 확인하고 싶습니다. 그것은 프레임 워크 구현 가능 아니면 사용자 정의 메서드를 작성해야합니까? 난 내 자신의 구현을 작성해야하는 경우, 어떻게 그렇게 할 수있는 가장 일반적인 방법이 될 것입니다?
어떤 도움을 주셔서 감사합니다.
해결법
-
==============================
1.당신이 테이블의 존재를 확인해야하는 경우 사용자 정의 SQL 코드를 호출해야합니다 :
당신이 테이블의 존재를 확인해야하는 경우 사용자 정의 SQL 코드를 호출해야합니다 :
bool exists = context.Database .SqlQuery<int?>(@" SELECT 1 FROM sys.tables AS T INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id WHERE S.Name = 'SchemaName' AND T.Name = 'TableName'") .SingleOrDefault() != null;
DbSet의 이름이 유래 된 상황에 노출되지만 기본 이름이 유창 API의 ToTable 방법 또는 테이블 데이터 주석에 의해 중 하나를 오버라이드 (override) 할 수있는 테이블 이름은 기본적으로 정의된다.
일반적인 방법으로 이렇게하면 코드 첫 번째 방법으로되어있는 것이 아닙니다. 즉 메타 데이터를 검색 할 필요가 수동으로 테이블 매핑 엔티티가되는 모색 할 것 -이 꽤 복잡 할 수 있습니다 엔티티가 여러 테이블에 매핑 할 수 있기 때문이다. 코드는 먼저 메타 데이터에 대한 액세스를 제공하지 않습니다. 당신은 ObjectContext는에 DbContext를 변환의 MetadataWorkspace을 검색해야합니다.
편집하다:
ObjectContext는에 DbContext를 변환하려면 이것을 사용 :
ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
-
==============================
2.나는 이전 게시물에 댓글을 추가 할 수 없습니다. 나는 SQL 콤팩트를 사용하고 있는데 나는 테이블의 스키마를 모른다. 내가 표를 확인하기 위해이 코드를 사용하고 있는데 그것은 그 이전 게시물에 꽤 동일합니다하지만 그것은 모든 테이블에 적용됩니다.
나는 이전 게시물에 댓글을 추가 할 수 없습니다. 나는 SQL 콤팩트를 사용하고 있는데 나는 테이블의 스키마를 모른다. 내가 표를 확인하기 위해이 코드를 사용하고 있는데 그것은 그 이전 게시물에 꽤 동일합니다하지만 그것은 모든 테이블에 적용됩니다.
/// <summary> /// Check if data table is exist in application /// </summary> /// <typeparam name="T">Class of data table to check</typeparam> /// <param name="db">DB Object</param> public static bool CheckTableExists<T>(this ModelLocker db) where T : class { try { db.Set<T>().Count(); return true; } catch (Exception) { return false; } }
-
==============================
3.다른 방법; 그 라디의 효율적으로 아니지만,이 SQL 서버에 연결되지 것 (추가 편집 된 경우 주소 성능 문제에 절) :
다른 방법; 그 라디의 효율적으로 아니지만,이 SQL 서버에 연결되지 것 (추가 편집 된 경우 주소 성능 문제에 절) :
bool CheckTableExists() { try { context.YourTable.Where(s => s.<yourKeyField> = <impossible value>).Count(); return true; } catch (Exception) { return false; } }
-
==============================
4.가정 : SQL 서버
가정 : SQL 서버
DbSet 테이블이 존재하지 않는 것을 의미하지 않는다 쿼리 할 때 이전의 모든 예외를 잡기.
테이블 타입되는 SQLException의 내부 예외를 가지는 EntityCommandExecutionException가 발생합니다 존재하지 않는 DbSet 쿼리. 즉, 내부 예외는 ErrorNumber 속성을 갖는다.
오류 번호 208 (소스) 읽습니다
-
==============================
5.나는 코드를 다음을 조금 더 이해할 수있다 생각합니다.
나는 코드를 다음을 조금 더 이해할 수있다 생각합니다.
using(YourDbEntities db = new YourDbEntities()) { bool IsExists = db.Database .SqlQuery <int?> (@" SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '" + yourTableName + "' ") .FirstOrDefault() > 0; return IsExists; }
-
==============================
6.EF 코어에서, 나는 DbContext 클래스에 대한 확장 방법과 TableExists 방법을 추가했습니다. 여기에 단정를 사용하여 내 솔루션입니다.
EF 코어에서, 나는 DbContext 클래스에 대한 확장 방법과 TableExists 방법을 추가했습니다. 여기에 단정를 사용하여 내 솔루션입니다.
using System.Linq; using Dapper; using Microsoft.EntityFrameworkCore; public static class DbContextsExtensions { public static bool TableExists(this DbContext dbContext, string tableName) { var sqlQ = $"SELECT COUNT(*) as Count FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '{tableName}'"; var conn = dbContext.Database.GetDbConnection(); { if (conn != null) { // Query - method extension provided by Dapper library var count = conn.Query<int>(sqlQ).FirstOrDefault(); return (count > 0); } } return false; } }
그리고 여기에 사용 예입니다 :
if(context != null && context.TableExists("AppSettings")) { // do something; }
이 도움말을 다른 사람을 바랍니다.
from https://stackoverflow.com/questions/6100969/entity-framework-how-to-check-if-table-exists by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 일부 단어 MySQL의 전체 텍스트 검색 (0) | 2020.07.03 |
---|---|
[SQL] SQL Server 관리 Studio는 - 어떻게 테이블을 삭제하지 않고 필드 유형을 변경합니다 (0) | 2020.07.03 |
[SQL] SQL의 경우 문, 어떻게 여러 변수를 반환? (0) | 2020.07.03 |
[SQL] 변수 파일 이름으로 대량 삽입 (0) | 2020.07.03 |
[SQL] SQL 서버 AS 문 WHERE 문 내에서 열을 별칭 (0) | 2020.07.03 |