DataContext 테이블 또는보기가 있는지 여부를 빠르게 감지하는 방법

StackOverflow https://stackoverflow.com/questions/1074190

  •  21-08-2019
  •  | 
  •  

문제

현재 LINQ-to-SQL을 통해 다양한 데이터베이스에 의존하고 연결되는 응용 프로그램을 개발하고 있습니다. 데이터베이스 중 하나의 경우 연결 문자열이 다를 수 있으므로 구성 가능 하므로이 데이터베이스의 스키마는 모든 연결 문자열과 동일합니다.

구성 가능한 연결 문자열로 인해 애플리케이션 시작 중에 Datacontext를 검증하여 응용 프로그램이 사용하는 모든 테이블과보기를 사용할 수 있는지 확인하려고합니다.

그만큼 Table<T> 객체의 개체 DataContext 해당 SQL 테이블이나보기에 레코드가 없더라도 객체는 항상 초기화됩니다.

그럼. 현재 유효성 검사는 다음과 같이 수행됩니다.

        bool valid = _dataContext.Articles.Count() > 0
            && _dataContext.Customers.Count() > 0
            && _dataContext.Orders.Count() > 0;

이것이 작동하는 동안 유효한 가치의 결정은 꽤 시간이 걸리며 (각 테이블의 모든 레코드가 터치 됨) 궁극적으로 시간이 초과됩니다. 따라서 더 빠르고 신뢰할 수있는 방법이 Table<T> 확실한 DataContext 실제로 해당 데이터베이스의 테이블로 존재합니까?

도움이 되었습니까?

해결책

다음은 (테스트되지 않은) 아이디어입니다.

테이블의 이름을 잡으십시오. 하드 코드를 사용하거나 프로그래밍 방식으로 가져갈 수 있습니다.

TableAttribute attribute = (TableAttribute)typeof(MyTableObject)
                           .GetCustomAttributes(typeof(TableAttribute), true)
                           .Single();
string name = attribute.Name;

MyTableObject LINQ-to-SQL 생성 된 객체에 포함되어 있습니다 Table, 즉, 일반 매개 변수입니다 T 안에 Table<T>.

(TableAttribute 들어 왔습니다 System.Data.Linq.Mapping.)

사용 DataContext.ExecuteQuery 방법과 같은 방법

var db = new MyDataContext();
var results = db.ExecuteQuery<string>("SELECT name FROM dbo.sysobjects WHERE xtype = 'U'");
bool hasTable = results.Any(s => "dbo." + s == name);    

다른 팁

Jason의 대답에 약간의 변화가 있습니다 (나는 그에게 Upvote를 주었다 :))

public bool TableExistsInDatabase<T>()
{
  TableAttribute attribute = (TableAttribute)typeof(T)
                             .GetCustomAttributes(typeof(TableAttribute), true)
                             .Single();

  var result = ExecuteQuery<bool>(
                String.Format(
                  "IF OBJECT_ID('{0}', 'U') IS NOT NULL
                   SELECT CAST(1 AS BIT) ELSE 
                   SELECT CAST(0 AS BIT)", attribute.Name));

  return result.First();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top