복붙노트

[SQL] 엔티티 프레임 워크 - 테이블이 존재하는지 확인하는 방법?

SQL

엔티티 프레임 워크 - 테이블이 존재하는지 확인하는 방법?

나는 코드 첫 번째 접근 방식으로 엔티티 프레임 워크를 사용하고 있습니다. 기본 클래스 DbContext 생성 및 삭제 데이터베이스뿐만 아니라 그 존재를 확인하는 기능이 있습니다.

나는 특별한 테이블 (실체) 기존 여부되어 있는지 확인하고 싶습니다. 그것은 프레임 워크 구현 가능 아니면 사용자 정의 메서드를 작성해야합니까? 난 내 자신의 구현을 작성해야하는 경우, 어떻게 그렇게 할 수있는 가장 일반적인 방법이 될 것입니다?

어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.다른 방법; 그 라디의 효율적으로 아니지만,이 SQL 서버에 연결되지 것 (추가 편집 된 경우 주소 성능 문제에 절) :

    다른 방법; 그 라디의 효율적으로 아니지만,이 SQL 서버에 연결되지 것 (추가 편집 된 경우 주소 성능 문제에 절) :

    bool CheckTableExists()
    {
        try
        {
            context.YourTable.Where(s => s.<yourKeyField> = <impossible value>).Count();
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }
    
  4. ==============================

    4.가정 : SQL 서버

    가정 : SQL 서버

    DbSet 테이블이 존재하지 않는 것을 의미하지 않는다 쿼리 할 때 이전의 모든 예외를 잡기.

    테이블 타입되는 SQLException의 내부 예외를 가지는 EntityCommandExecutionException가 발생합니다 존재하지 않는 DbSet 쿼리. 즉, 내부 예외는 ErrorNumber 속성을 갖는다.

    오류 번호 208 (소스) 읽습니다

  5. ==============================

    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. ==============================

    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;
    }
    

    이 도움말을 다른 사람을 바랍니다.

  7. from https://stackoverflow.com/questions/6100969/entity-framework-how-to-check-if-table-exists by cc-by-sa and MIT license