코드 우선 엔티티 프레임 워크에서 뷰를 사용하는 방법 [닫힌]


87

먼저 엔티티 프레임 워크 코드에서 데이터베이스보기를 사용하려면 어떻게해야합니까?


2
아래 답변에는 EF 마이그레이션을 사용하여보기를 만드는 방법이 설명되어 있지 않습니다. 비슷한 질문에 대해서는 이 답변 을 참조하십시오 .
Rudey

여기에 정확히 같은 질문이있는 스레드가 있습니다. - stackoverflow.com/questions/13593845/...
사업부 Tiwari 보낸

솔루션을 사용해보십시오 . 뷰로 표시된 테이블에 대한 마이그레이션 생성 방지
kogoia

답변:


95

저처럼 다른 데이터베이스 (제 경우에는 erp)에서 가져온 엔티티를 매핑하여 애플리케이션의 특정 엔티티에 연결하는 데만 관심이 있다면 테이블을 사용할 때 뷰를 사용할 수 있습니다. 같은 방식으로!). 분명히 해당 엔티티를 업데이트하려고하면 뷰를 업데이트 할 수없는 경우 예외가 발생합니다. 절차는 일반 (테이블 기반) 엔티티의 경우와 동일합니다.

  1. 보기에 대한 POCO 클래스를 만듭니다. 예를 들어 FooView
  2. DbContext 클래스에 DbSet 속성 추가
  3. FooViewConfiguration 파일을 사용하여 뷰에 다른 이름을 설정하거나 (생성자에서 ToTable ( "Foo"); 사용) 특정 속성을 설정합니다.

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
    {
        public FooViewConfiguration()
        {
            this.HasKey(t => t.Id);
            this.ToTable("myView");
        }
    }
    
  4. FooViewConfiguration 파일을 modelBuilder에 추가합니다. 예를 들어 Context의 OnModelCreating 메소드를 ovveriding합니다.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FooViewConfiguration ());
    }
    

64
"Code First"를 가정하지 않은 경우 +1 == 자동 데이터베이스 생성
onetwopunch

3
@DaveJellison 당신은 정교한 또는 IDatabaseInitializer의 일부로보기를 추가하는 방법에 대한 링크를 제공하기 위해 신경 것
랄프 Shillington

18
나뿐입니까, 아니면 모두 마이그레이션으로 인해 빈 테이블이 생성됩니까? 그것을 피할 수있는 방법이 있습니까?
Kremena Lalova 2015

4
여기서 확인하는 것만으로도이 솔루션을 사용하려면 외부에서 미리 SQL 데이터베이스에보기를 만들어야합니까? 코드에서 뷰를 정의하고 Add-Migration / Update-Database 명령을 통해 데이터베이스에 채우도록 할 수 있습니까?
frostshoxx

6
몇 가지. 1.이 대답은 SQL을 사용하여 수동으로 뷰를 만들어야한다는 것을 언급하지 않습니다. 이것은 마이그레이션을 사용하여 수행 할 수 있습니다. 2. 클래스 이름이보기 이름과 일치하면보기 이름을 구성 할 필요가 없습니다. 3. 다음과 같이 DataAnnotations를 사용할 수 있습니다. [Table("myView")], 이것은 EntityTypeConfiguration.
Rudey

23

이것은 업데이트 일 수 있지만 EF 코드로 뷰를 사용하려면 먼저 [Table ( "NameOfView")]를 클래스 맨 위에 추가하기 만하면 다른 모든 사용자가 겪고있는 모든 작업을 거치지 않고도 모두 제대로 작동합니다. 또한 열 중 하나를 [키] 열로보고해야합니다. 다음은이를 구현하는 샘플 코드입니다.

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SomeProject.Data
{
    [Table("SomeView")]
    public class SomeView
    {
        [Key]
        public int NameID { get; set; }
        public string Name { get; set; }
    }
}

그리고 컨텍스트는 다음과 같습니다.

using System.Data.Entity;

namespace SomeProject.Data
{
    public class DatabaseContext : DbContext
    {
        public DbSet<SomeView> SomeViews { get; set; }
    }
}

2
이것은 허용 된 답변이 EF Fluid API를 사용하는 동안 DataAnnotations를 사용한다는 점을 제외하면 허용 된 답변과 동일합니다.
Rudey

4
사실 그렇지 않습니다. 나는 성공하지 못하고 받아 들여진 대답을 시도했지만 잘 작동하지 않았습니다. 그러나 나는 마이그레이션을 사용하고 있으므로 이것이 영향을 미칠 수 있습니다. 먼저 마이그레이션을 수행 한 다음 데이터베이스에 이미 존재하므로 뷰 클래스를 추가해야합니다. 데이터베이스에 기존 테이블이 이미있는 경우 정확히 동일한 방식으로 처리합니다. 뷰는 "가상 테이블"이므로 Entity Framework의 테이블 구문은 여전히 ​​작동합니다.
Charles Owen

12

원하는 것이 비정규 화 된 객체 다발이면 클래스 IQueryable<TDenormolized>에 공개 get-only 속성을 만들 수 있습니다 DbContext.

에서 getLinq 결과를 반환하여 비정규 화 된 값을 비정규 화 된 객체에 투영합니다. 프로그래밍 중이므로 select명령문 만 사용하는 것이 아니라 DB View를 작성하는 것보다 낫습니다 . 또한 컴파일 시간 유형이 안전합니다.

ToList()호출 과 같은 열거를 트리거하지 않도록주의 하십시오. 지연된 쿼리가 중단되고 결국 데이터베이스에서 백만 개의 레코드를 가져와 애플리케이션 서버에서 필터링 할 수 있습니다.

이것이 올바른 방법인지는 모르겠지만 시도해 보았고 효과가 있습니다.


6
뷰를 사용하고 싶은 이유 중 하나는 EF에 의해 생성 된 SQL이 항상 '좋은'것은 아니기 때문입니다. 모델에 상속 계층 구조가 몇 가지 있으며 (너무 늦게 함정에 대해 알게되었습니다 ...) 뷰를 사용하면 SQL을 수동으로 생성합니다. 뷰는 것이 바람직 할 것입니다 이유에 그냥 대위법

2
이렇게하지 않는 다른 이유는 LINQ에서 사용할 수없는 재귀 공통 테이블 식을 사용하기 때문일 수 있습니다. 그러나 그렇지 않으면 이것은 더 간단한 시나리오에 대한 좋은 조언입니다.
Tom Pažourek

1
인덱싱 된 뷰 의 이점을 활용하려는 경우 뷰 대신 속성을 사용하는 것은 옵션이 아닙니다 .
Rudey

"선택문만을 사용하는 것에 제한을받지 않습니다." 이것은 무엇을 의미합니까? LINQ로 할 수있는 모든 작업은 SELECT 문을 사용하여 수행 할 수 있습니다. 다른 방법으로는 동일하게 말할 수 없습니다.
Rudey

3

나는 이것이 오래된 질문이고 여기에 많은 답변이 있다는 것을 알고 있지만 답변을 사용할 때 문제 가 발생했으며 패키지 관리자 콘솔에서 update-database 명령을 사용할 때 오류가 발생했습니다.

데이터베이스에 이미 '...'라는 개체가 있습니다.

이 문제를 해결하기 위해 다음 단계를 사용합니다.

  1. 패키지 관리자 콘솔에서이 명령을 실행하십시오.
  2. Migrations 폴더에서 ..._ intial.cs 파일을 찾아 열고 매핑하려는 클래스와 관련된 명령을 주석 처리하거나 삭제할 수 있습니다.
  3. 이제 일반적으로 모델에 대한 다른 변경 사항에 대해 update-database 명령을 사용할 수 있습니다.

도움이되기를 바랍니다.


1
감사! 이것은 정말 도움이되었습니다! 추가로 EF 마이그레이션으로 생성 된 코드를 제거하는 대신 여기에 추가 할 수 있습니다 migrationBuilder.Sql("CREATE OR REPLACE VIEW .... 따라서 동료들도이를 사용하여 데이터베이스를 업그레이드 할 수 있습니다.
Rich_Rich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.