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.
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:
Bạn không thể sử dụng SQL FILESTREAM
trong 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 FILESTREAM
trong 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)
.
Tôi luôn tạo một lớp khác như ProductImage
vớ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; }
}
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.