24

Tôi có một dự án webforms sử dụng mã EFđầu tiên để duy trì dữ liệu. Tôi muốn sử dụng GridView và EntityDataSource, để lưu CRUD. Điều này có khả thi không?Chuyển đổi DBContext sang ObjectContext để sử dụng với GridView

Tôi có thể chuyển đổi DBContext thành ObjectContext được EntityDataSource mong đợi không?

Đây là những gì tôi đã cố gắng:

<asp:EntityDataSource ID="OrdersDataSource" runat="server" ContextTypeName="SomeNamespace.Models.ShopDBContext" 
    EnableFlattening="False" EntitySetName="Orders" EntityTypeFilter="Order" EnableDelete="False" 
    EnableUpdate="False" Include="OrderLines" OrderBy="it.Id"> 
</asp:EntityDataSource> 

<asp:GridView ID="OrdersGridView" runat="server" AllowPaging="True" AllowSorting="True" 
    AutoGenerateColumns="True" DataKeyNames="Id" DataSourceID="OrdersDataSource" /> 

Tuy nhiên tôi nhận được ngoại lệ này:

Không thể cast đối tượng của loại 'SomeNamespace.Models.ShopDBContext' gõ 'System.Data.Objects. ObjectContext '.

+2

bản sao có thể có của [Cách liên kết mã EF Đầu tiên DbContext với một nguồn dữ liệu Asp.Net?] (Http://stackoverflow.com/questions/6327937/how-to-bind-ef-code-first-dbcontext-to -an-asp-net-datasource) –

+0

Thật vậy nó là một bản sao, cảm ơn (lưu ý: tìm kiếm cho "DBContext ObjectContext GridView" sẽ tìm thấy điều này nhưng không phải là câu hỏi có câu trả lời) – Myster

Trả lời

64

Hãy thử điều này:

var context = new YourDbContext(); 
var adapter = (IObjectContextAdapter)context; 
var objectContext = adapter.ObjectContext; 
+1

Thiên Chúa được tìm kiếm khắp nơi cho những dòng . Cảm ơn! – forhas

+2

Đây có thể là một câu hỏi ngớ ngẩn nhưng nếu 'YourDbContext' kế thừa 'IObjectContextAdapter', tại sao bạn phải truyền nó? Không nên 'YourDbContext' khởi tạo ObjectContext? – Eitan

+1

Bởi vì giao diện IObjectContextAdapter chỉ có một thuộc tính (ObjectContext) được triển khai theo cách riêng tư trên Lớp DbContext. Kiểm tra liên kết này http://stackoverflow.com/questions/792908/what-is-a-private-interface – marianosz

3

Hãy thử điều này một ->

protected void OrdersDataSource_ContextCreating(object sender, EntityDataSourceContextCreatingEventArgs e) 
{ 
    var context = new YourContext(); 
    e.Context = ((IObjectContextAdapter)context).ObjectContext; 
} 
1

Sau 2 ngày kể từ khi gặp khó khăn, tôi thấy link này đã giúp tôi một lot.I đang làm việc withVS năm 2012 và Tôi đã có cùng một vấn đề với DBContext.
Theo liên kết, trong VS2012 trình tạo mã mặc định đã được thay đổi để tạo các thực thể POCO và DBContext trái với các thực thể có nguồn gốc từ EntityObject và ObjectContext được mặc định trong VS2010.
Trong trình thám hiểm giải pháp, trong mô hình thực thể của bạn, bạn cần phải loại bỏ các mẫu tt và, trong trình thiết kế, bấm vào bề mặt thiết kế và sau đó trong các thuộc tính thay đổi chiến lược tạo mã từ Không thành Mặc định để lấy các thực thể dựa trên EntityObject và Ngữ cảnh bắt nguồn từ ObjectContext.