Tôi có một trường varbinary (max) trong một trong các bảng của tôi nhưng tôi không cần nó mỗi lần và tôi đang tìm cách lấy nó từ cơ sở dữ liệu chỉ khi cần thiết. Tôi đang sử dụng ADO.NET Entity Framework. Làm thế nào để làm điều đó?Làm thế nào để tải các trường varbinary (max) chỉ khi cần thiết với ADO.NET Entity Framework?
Trả lời
Giải pháp là để tạo ra một bảng riêng biệt với lĩnh vực varbinary và làm cho 1-to-1 mối quan hệ giữa các bảng
Một cách sẽ được dự án kết quả của bạn đặt vào một loại vô danh khi bạn không cần blob:
from entity in context.Entities
select new
{
Field1 = entity.Field1,
Field2 = entity.Field2
}
Trong ví dụ này, chỉ Field1 và Field2 sẽ được nạp.
Phương pháp này có bất lợi là bạn không thể cập nhật thể hiện được trả về và thực hiện context.SaveChanges. Mặc dù tôi cho rằng việc lưu một cá thể không có kiến thức đầy đủ về cá thể là đường biên không an toàn. Phương thức này là tốt khi bạn muốn một danh sách dài trả về các cá thể, nhưng sẽ truy vấn một cá thể đơn, trường varbinary và tất cả, trước khi bạn thực sự cập nhật.
Cảm ơn sự hỗ trợ của bạn. Tôi đã tìm kiếm một cái gì đó tương tự như tải lười biếng của trường varbinary :) nhưng có vẻ như điều này là không thể. – Emil
Nó không nhất thiết phải để tạo ra bảng riêng biệt. Bạn nên thực hiện một số bước. Giả sử rằng chúng ta có bảng 'Documents' (Id, Name, Data (varbinary)).
- Mở nhà thiết kế EF, sao chép và dán pháp nhân 'Tài liệu'.
- Đổi tên thành 'DocumentData'. Thêm ánh xạ vào bảng 'Tài liệu'.
- Xóa thuộc tính 'Dữ liệu' trong thực thể 'Tài liệu'.
- Xóa thuộc tính 'Tên' trong thực thể 'DocumentData'.
- Nhấp chuột phải vào thực thể 'DocumentData' và thêm Hiệp hội mới. Chọn liên kết 1 đến 1 với thực thể 'Tài liệu'.
- Chọn liên kết mới, đi đến Thuộc tính, bấm '...' trên trường 'Giới hạn Tham chiếu', chọn thực thể 'Tài liệu' làm nguyên tắc, để tất cả mặc định (Id -> Id) và bấm OK.
Bây giờ, hãy tạo dự án.
LƯU Ý. Bây giờ, khi tạo thực thể 'Tài liệu' mới, bạn cũng nên tạo đối tượng 'DocumentData' mới ngay cả khi bạn không muốn đặt bất kỳ dữ liệu nào:
Document doc = new Document();
doc.Name = "My document";
doc.DocumentData = new DocumentData();
context.Documents.Add(doc);
context.SaveChanges();
Chia tách bảng. Công cụ Entity Developer cho phép thực hiện điều này một cách trực quan. Bạn có thể ánh xạ thực thể của mình cho các bảng khác nhau.
Bạn nên xóa trường biến của mình khỏi bảng và đặt trường đó vào bảng khác, tạo mối quan hệ 1-1 giữa các bảng đó. Đây là phương pháp hay vì bạn có thể dễ dàng thực hiện tải chậm và các nội dung khác ..
Không phải lúc nào cũng có thể trên một lược đồ hiện có, nhưng có lẽ là cách tiếp cận dễ nhất khi có thể. Tôi đã làm điều đó, với một chìa khóa nước ngoài để "trung" bảng trong "bảng chính" của tôi, kiểm tra nếu FK là null hoặc không cho phép quicly biết thời tiết hay không nếu một "phụ" ghi tồn tại mà không cần phải thực sự tải nó. – AFract