2012-03-18 2 views
3

우리 프로젝트는 Entity Framework Code First를 사용합니다. 아주 간단한 POCO가 데이터베이스의 많은 테이블을 나타내는 경우를 원합니다. SQL Azure의 가로 분할 전략의 일부입니다. SQL Azure는 파일 그룹을 지원하지 않으므로 일반적인 파티셔닝을 지원하지 않습니다. 매우 많은 수의 테이블이 있으므로 기본 테이블의 CHECK CONSTRAINT를 통해 분할 뷰로 UNION ALL 뷰를 사용할 수 없습니다.Fluent API 매핑을 동적으로 변경하십시오.

따라서 런타임에 필요에 따라 매핑을 수행하는 것이 좋습니다. 그러나 이것은

modelBuilder.Entity<EntityName>().ToTable("foo", "bar"); 

과 같은 코드를 통해 DbContext 클래스의 OnModelCreating 이벤트에서 발생합니다. 우리가 공장에서이 매핑을 수행 할 수 있습니까? 우리는 Factory에 메타 데이터를 제공하고 ModelBuilder를 통해 POCO와 테이블을 일대일로 매핑하는 대신 Fluent API를 사용하는 것을 선호합니다.

+0

당신이 무엇을 요구하는지 명확하지 않습니다. 'OnModelCreating'에서 항상 매핑을 생성하는 커스텀 코드를 가질 수 있습니다. –

+0

OnModelCreating에서 정의하고 싶지 않습니다. 하나의 클래스가 있어야하고 동일한 스키마를 가진 여러 테이블에 해당 클래스를 동적으로 매핑 할 수 있어야합니다. OnModelCreating에서이 작업을 수행 할 경우 해당 옵션이 없다고 생각합니다. OnModel을 사용하면 하나의 테이블로 매핑됩니다. –

답변

5

DbContext 파생물에 테이블 이름과 메타 스키마 이름에 대한 두 개의 문자열 인수가있는 생성자를 추가 할 수 있습니다. 멤버 변수에 이름을 저장하고 ToTable 메서드에서 사용할 수 있습니다.

DbModel은 실제로 필요할 때 생성되므로 생성자는 항상 OnModelCreating 이벤트 전에 실행됩니다. (파생 클래스에서는 항상 그런 것은 아니지만 다른 주제입니다.)

최적화를 사용하면 DbModel을 컴파일하고 DbContextthe constructor accepting a DbCompiledModel으로 빌드 할 수 있습니다.

+0

나는이 아이디어를 좋아한다. 고맙습니다. 두 개 이상의 엔터티에 대한 사용자 지정 매핑을 원한다면 어떻게해야합니까? Dictionary 을 전달하여 EntityName을 키로, TableName을 값으로 사용하여 모든 매핑을 포함한다고 가정합니다. 당신의 생각? –

+0

물론 가능합니다. 또는'Dictionary '을 사용하여보다 안전한 형식을 만들 수 있습니다. –

+0

니스! 감사. 나는이 스레드가 조금 끓여서 무엇이 발전하는지 보게 할 것이다. 나는 너의 대답을 좋아한다. –

관련 문제