2012-01-06 21 views
6

Tôi có một trang web ASP.NET 4 Dynamic Data đang chạy với một bộ bảng cơ sở dữ liệu khá đơn giản, được hiển thị thông qua một mô hình Entity Framework trong một assembly khác. Tôi không muốn để giàn giáo tất cả của các bảng trong mô hình EF, vì vậy trong file Global.asax của tôi, tôi đã khởi tạo mô hình mặc định như thế này:ASP.NET Dynamic Data không nhìn thấy một phần siêu dữ liệu "buddy" class

DefaultModel.RegisterContext(typeof(MyCompany.MyProject.DataModel.DataContext), new ContextConfiguration() { ScaffoldAllTables = false });

Các tài liệu MSDN (và các ý kiến ​​trong tập tin global.asax) nói rằng bây giờ tôi có thể chọn lọc cho phép giàn giáo của các bảng riêng lẻ bằng cách thêm thuộc tính [ScaffoldTable(true)] vào lớp "bạn thân" của chúng. Tôi đã làm như vậy như thế này:

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Web.DynamicData; 

namespace MyCompany.MyProject.DataModel 
{ 
    [MetadataType(typeof(InHouseClaimMetadata))] 
    [ScaffoldTable(true)] 
    public partial class InHouseClaim 
    { 
     [DisplayName("In-House Claims")] 
     [TableName("In-House Claims")] 
     public class InHouseClaimMetadata 
     { 
      [DisplayName("Reporting Date")] 
      public object ReportingDate { get; set; } 

      // etc etc... 
     } 
    } 
} 

Nhưng khi tải Default.aspx, tôi nhận được thông báo lỗi sau:

Không có bảng truy cập. Đảm bảo rằng ít nhất một mô hình dữ liệu được đăng ký trong Global.asax và giàn giáo được bật hoặc triển khai các trang tùy chỉnh.

Tôi đã làm việc này trong các tình huống tương tự trước đây; một điều khác biệt về nỗ lực này là mô hình EF của tôi là hội đồng của riêng mình. Nếu tôi thay đổi global.asax để đi trước và giàn giáo tất cả các bảng, nó hoạt động tốt. Nhưng rõ ràng, tôi không muốn điều đó. Tôi đã cẩn thận để đảm bảo rằng không gian tên cho lớp siêu dữ liệu một phần khớp với không gian tên của ngữ cảnh dữ liệu EF.

Vì vậy, tôi bối rối ...

+0

Anh chàng này đã đi trước tôi: http://stackoverflow.com/questions/647385/is-it-possible-to- có hai phần-lớp-trong-khác nhau-hội-đại diện- –

Trả lời

4

Vì vậy, tôi là một thằng ngốc: đây không phải là vấn đề về dữ liệu động hoặc EF, đó là ràng buộc C#. Từ MSDN:

Tất cả các định nghĩa phần-type có nghĩa là các bộ phận của cùng loại phải được định nghĩa trong cùng một assembly và các mô-đun tương tự (.exe hoặc .dll tập tin). Định nghĩa một phần không thể mở rộng nhiều mô-đun.

1

Tôi đã cố gắng để tái tạo kịch bản của bạn, và thay vì sử dụng tài sản mappging Tôi đã thử nghiệm bằng cách sử dụng đoạn mã sau:

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Web.DynamicData; 

namespace MyCompany.MyProject.DataModel 
{ 
    [MetadataType(typeof(InHouseClaimMetadata))] 
    [ScaffoldTable(true)] 
    public partial class InHouseClaim 
    { 
     public class InHouseClaimMetadata 
     { 

     } 
    } 
} 

Điều này làm việc nếu không gian tên của ngữ cảnh dữ liệu EF khớp với không gian tên của các lớp một phần. Bạn có thể thử và bình luận ra ánh xạ thuộc tính của bạn để loại bỏ những vấn đề đó như một vấn đề, và xem cách bạn đi từ đó?

+0

Không may mắn. Nhưng câu trả lời của bạn đã dẫn tôi để tước mã của tôi xuống kịch bản tối thiểu để xác định vấn đề rõ ràng hơn. –

1

Điều gì làm việc cho tôi, trong Solution Explorer, nhấp chuột phải vào tệp .cs chứa các lớp một phần của tôi, chọn Thuộc tính và thiết lập Build Action to Compile. Vì lý do gì đó, tác vụ Xây dựng của tệp được đặt thành Nội dung theo mặc định. (Hãy cho tôi giờ để tìm ra điều này. Hy vọng rằng, điều này sẽ tiết kiệm thời gian cho ai đó.)

+0

Không tạo các tệp này trong thư mục _App_Code_. – ofthelit

Các vấn đề liên quan