Làm thế nào để lưu trữ hình ảnh bằng Entity Framework Code First CTP 5?


83

Tôi chỉ đang cố gắng tìm hiểu xem có cách nào đơn giản để lưu trữ và truy xuất dữ liệu (tệp) nhị phân bằng EF Code First CTP 5 không? Tôi thực sự muốn nó sử dụng loại FILESTREAM, nhưng tôi thực sự đang tìm cách nào đó để làm cho nó hoạt động.

Câu trả lời:


41

Bạn không thể sử dụng SQL FILESTREAMtrong EF. EF được cho là hoạt động trên các máy chủ cơ sở dữ liệu khác nhau nhưng tính năng dòng lọc là tính năng cụ thể của SQL 2008 và mới hơn. Bạn có thể thử làm theo cách cũ - sử dụng varbinary(max)trong bảng cơ sở dữ liệu của bạn và sử dụng mảng byte trong lớp được ánh xạ của bạn.

Biên tập:

Làm rõ một chút - bạn có thể sử dụng FILESTREAMtrong cơ sở dữ liệu nhưng EF sẽ không tận dụng tính năng phát trực tuyến. Nó sẽ tải nó theo tiêu chuẩn varbinary(max).


112

Tôi luôn tạo một lớp khác như ProductImagevới liên kết một-một để quản lý tải chậm và cũng để bình thường hóa bảng:

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

4
Sẽ không đơn giản hơn nhiều nếu tạo một dạng xem không bao gồm cột hình ảnh tệp và sau đó tạo một thực thể thứ hai trong EF trỏ đến dạng xem thay vì bảng - ví dụ: "ProductLite"
C.List

@ C.List Tôi không thể tin rằng tôi đã sử dụng EF trong nhiều năm và chưa bao giờ nghĩ đến việc đó. Đó là một ý tưởng tuyệt vời và tôi chỉ sử dụng nó, loại bỏ một quan điểm không cần thiết mà tôi đang sử dụng để làm điều tương tự. Hãy gọi nó là một "thực thể ảo" :)
Greg Gum

65

Chỉ cần khai báo thuộc tính của bạn là byte [] như Ladislav đã đề cập.

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

    public string Name { get; set; }

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

Đó là khá nhiều đó. Nếu bạn không ánh xạ thuộc tính, quy ước là nó ánh xạ tới a varbinary(max). Nếu bạn có một cột hình ảnh trong cơ sở dữ liệu, chỉ cần thêm [Column(TypeName = "image")]vào thuộc tính ProductImage hoặc nếu bạn thích ánh xạ mã, hãy thêm cột này vào ghi đè OnModelCreating của bạn trong lớp ngữ cảnh:

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

Vấn đề mà tôi gặp phải là tôi chưa tìm ra cách làm cho thuộc tính lười biếng vì tôi không nhất thiết phải tải dữ liệu nhị phân mỗi khi tôi tìm nạp một sản phẩm. Tôi không chắc mình nhớ lại chính xác nhưng NHibernate có thể làm điều đó ra khỏi hộp.


Có, NHibernate có thể thực hiện tải lười biếng cho từng cột cụ thể: ayende.com/blog/4377/nhibernate-new-feature-lazy-properties .
gabe 12/1213
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.