Entity Framework Code First CTP 5를 사용하여 이미지를 저장하는 방법은 무엇입니까?


83

EF Code First CTP 5를 사용하여 이진 (파일) 데이터를 저장하고 검색하는 간단한 방법이 있는지 알아 보려고합니다. FILESTREAM 유형을 사용하고 싶지만 실제로 작동하도록 만드는 방법을 찾고 있습니다.

답변:


41

FILESTREAMEF 에서는 SQL 을 사용할 수 없습니다 . EF는 다른 데이터베이스 서버에서 작동하도록되어 있지만 파일 스트림 기능은 SQL 2008 이상의 특정 기능입니다. 이전 방식으로 시도해 볼 수 있습니다- varbinary(max)데이터베이스 테이블에서 사용하고 매핑 된 클래스에서 바이트 배열을 사용합니다.

편집하다:

약간의 설명- FILESTREAM데이터베이스에서 사용할 수 있지만 EF는 스트리밍을 활용하지 않습니다. 표준으로로드됩니다 varbinary(max).


112

ProductImage지연 로딩을 관리하고 테이블을 정규화하기 위해 항상 일대일 연결 과 같은 다른 클래스를 만듭니다 .

public class ProductImage
{
    public int ProductId { get; private set; }
    public byte[] Image { get; set; }
}

4
파일 이미지 열을 포함하지 않는보기를 만든 다음 테이블 대신보기를 가리키는 EF에서 두 번째 엔터티를 만드는 것이 훨씬 간단하지 않을까요? 예 : "ProductLite"
C.List

@ C.List 제가 EF를 수년 동안 사용해 왔고 그렇게 생각한 적이 없다는 것을 믿을 수 없습니다. 그것은 멋진 아이디어이고 나는 단지 그것을 사용하여 동일한 일을하기 위해 사용했던 불필요한 뷰를 제거했습니다. 하자 전화를 "가상 기업":
그렉 껌

65

Ladislav가 언급 한대로 속성을 byte []로 선언하면됩니다.

public class Product
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public byte[] ProductImage { get; set; }
}

그것은 거의 다입니다. 속성을 매핑하지 않으면 규칙은 varbinary(max). 데이터베이스에 이미 이미지 열이있는 [Column(TypeName = "image")]경우 ProductImage 속성에 추가 하거나 코드 매핑을 선호하는 경우 컨텍스트 클래스의 OnModelCreating 재정의에 추가합니다.

modelBuilder.Entity<Product>().Property(p => p.ProductImage).HasColumnType("image");

내가 가진 문제는 제품을 가져올 때마다 이진 데이터를 반드시로드하고 싶지 않기 때문에 속성을 게으르게 만드는 방법을 찾지 못했다는 것입니다. 정확히 기억할 수는 없지만 NHibernate는 즉시 사용할 수 있습니다.


예, NHibernate는 ayende.com/blog/4377/nhibernate-new-feature-lazy-properties에서 열별 지연 로딩을 즉시 수행 할 수 있습니다 .
gabe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.