2009-04-10 36 views
32

Tôi có một cơ sở dữ liệu mà tôi muốn xây dựng một mô hình EF từ, tuy nhiên tôi không muốn bao gồm các cột nhất định từ cơ sở dữ liệu vì các cột liên quan được duy trì độc quyền trên máy chủ và không được điều khiển bởi bất kỳ ứng dụng nào. Cả hai cột là DateTime (nếu điều này tạo ra bất kỳ sự khác biệt), một trong các cột là nullable và được duy trì bởi một trigger trên các bản cập nhật và cái kia không nullable và thiết lập bằng cách sử dụng một giá trị mặc định trong định nghĩa bảng.Entity Framework: Bỏ qua các cột

Tôi đoán tôi đang tìm kiếm thứ gì đó giống như tùy chọn "Máy chủ được tạo" trong Linq2Sql; nhưng tôi không thể tìm thấy một lựa chọn như vậy.

Ai đó có thể cho tôi biết cách giải quyết vấn đề này?

Nên biết trước:

Tôi đã cố gắng để giới thiệu mô hình đối tượng kinh doanh tại nơi tôi làm việc cho một vài năm và nó đã luôn luôn bị từ chối vì số lượng mã bổ sung mà phải là tay cranked. EF hiện đang được xem như là một giải pháp khả thi vì việc thiết kế và tạo mã do đó bất kỳ tùy chọn nào liên quan đến việc xoay tay XML sẽ chỉ biến những đồng nghiệp còn lại của tôi khỏi EF. Do đó, tôi đang tìm kiếm một cái gì đó có thể được thực hiện bằng cách sử dụng các nhà thiết kế hoặc sử dụng mã.

EDIT:

Tôi đoán rằng những gì tôi đang tìm kiếm ở đây là một trong hai ...

(a) một cách để tạo ra các mô hình mà không EF tham khảo các cột trong các cửa hàng (ssdl) và do đó không tìm cách thao tác nó theo bất kỳ cách nào (b) một cách để lập trình thuộc tính "StoreGeneratedPattern" đối với thuộc tính khi tôi tạo ObjectContext (câu trả lời dễ dàng là thao tác thủ công trong .ssdl, nhưng điều này sẽ được ghi đè nếu tôi làm mới mô hình từ cơ sở dữ liệu và tôi không thể đi xuống tuyến đường nơi .csdl, .msl & .ssdl được quay tay).

Trả lời

1

Bạn có không muốn cột xuất hiện trong mô hình không?

Thử chọn cột trong dạng xem Nhà thiết kế và nhấn phím xóa.

Sửa

Bạn có thể làm cho các setter cho sở hữu tư nhân. Sau đó, ứng dụng của bạn sẽ không thể sửa đổi giá trị.

+3

Thật không may, nếu tôi thử điều này, tôi sẽ gặp lỗi trong mô hình khi cột không được ánh xạ. –

+0

Loại lỗi nào? – TGnat

+0

Lỗi 3023: Sự cố trong Lập bản đồ Phân đoạn bắt đầu tại dòng 197: Cột TableName.ColumnName trong bảng TableName phải được ánh xạ: Nó không có giá trị mặc định và không có giá trị rỗng. –

2

Bạn không thể tạo chế độ xem với các cột bạn cần và nhập nó qua trình hướng dẫn chức năng thực thể và ánh xạ nó tới các thực thể của bạn?

+2

Cảm ơn, đây có thể là giải pháp mặc dù tôi muốn tránh phải tạo chế độ xem cho mỗi bảng nếu tôi có thể - các cột tôi đã mô tả trong bản gốc vấn đề thực sự xuất hiện trên mỗi bảng trong cơ sở dữ liệu. –

0

Nhấp chuột phải vào trường trong biểu diễn đồ họa và chọn xóa. Ive thấy rằng đôi khi bạn sẽ gặp lỗi khi bạn thực hiện nhiều thay đổi đối với mô hình cùng một lúc và bắt đầu mất dấu các thay đổi của mình. Đặt cược tốt nhất của bạn có thể là xây dựng lại mô hình tạo ra EF.

Hãy nhớ rằng khi bạn "cập nhật từ cơ sở dữ liệu", trường cũ trên mô hình được tạo sẽ không bị xóa, bạn sẽ phải xóa chúng theo cách thủ công. Ví dụ nếu bạn đổi tên DateField1 thành DateField2 trong cơ sở dữ liệu của bạn, và sau đó bạn "Cập nhật Mô hình từ Cơ sở dữ liệu", bây giờ bạn sẽ thấy cả DateField1 và DateField2 trên mô hình kết quả. Điều này có thể là nguyên nhân gây ra lỗi.

+0

Điều này hoạt động trên cột có giá trị rỗng, nhưng không hoạt động đối với cột không có giá trị rỗng, tạo ra lỗi giống như tùy chọn ở trên từ TGnat. –

+0

Lỗi 3023: Sự cố trong Ánh xạ Phân đoạn bắt đầu tại dòng 197: Cột TableName.ColumnName trong bảng TableName phải được ánh xạ: Nó không có giá trị mặc định và không có giá trị rỗng. –

+0

Tôi nhận được ... Tôi nghĩ bạn có thể bị kẹt. Thú vị lưu ý mặc dù ... tôi có một rowversion (timestamp) cột trên một trong các bảng db của tôi, và các máy phát điện EF một cách chính xác thiết lập các StoreGeneratedPattern thuộc tính:

28

Bạn có thể thực hiện việc này với Khung thực thể không? Vâng; dễ thôi.Bạn có thể làm điều này với nhà thiết kế Entity Framework không? Thật không may, đó là khó khăn hơn nhiều.

Sự cố bạn gặp phải là cột tồn tại trong giản đồ lưu trữ (SSDL) trong EDMX của bạn. Việc loại bỏ cột với trình thiết kế GUI đơn giản loại bỏ nó khỏi lược đồ máy khách, không phải lược đồ hoặc lược đồ lưu trữ. Tuy nhiên, nó đủ đơn giản để đi vào EDMX và loại bỏ nó. Sau khi thực hiện điều đó, bạn cũng có thể loại bỏ nó khỏi ánh xạ trong các phần lược đồ máy khách của EDMX và khung thực thể sẽ còn phàn nàn rằng nó chưa được ánh xạ.

Sự cố được giải quyết, đúng không?

Ồ, không. Khi bạn sử dụng trình thiết kế GUI để cập nhật EDMX từ cơ sở dữ liệu, lược đồ lưu trữ được bỏ đi và được tạo lại. Vì vậy, cột của bạn sẽ quay trở lại. Theo tôi biết, không có cách nào để nói với nhà thiết kế GUI không bao giờ ánh xạ một cột cụ thể. Vì vậy, bạn sẽ phải làm lại điều này mỗi lần bạn cập nhật với trình thiết kế GUI. May mắn thay, EDMX là XML, vì vậy bạn có thể làm điều này với một biến đổi XML, LINQ, hoặc công cụ XML mà bạn chọn.

+1

Cảm ơn, tôi nhận ra rằng tôi có thể làm điều này bằng cách chỉnh sửa XML, tôi chỉ hy vọng có một cách khác - chẳng hạn như lập trình thuộc tính StoreGeneratedPattern khi tạo ngữ cảnh. –

+1

Vâng, câu trả lời là như nhau (đối với StoreGeneratedPattern). Bạn có thể đặt StoreGeneratedPattern trong XML và nó sẽ hoạt động tốt, nhưng trình thiết kế GUI sẽ thổi nó đi khi bạn cập nhật.Entity Framework có các tính năng mà trình thiết kế GUI chưa hỗ trợ hoàn toàn. –

+0

Tùy chọn duy nhất khác là thử và thay đổi siêu dữ liệu của cơ sở dữ liệu sao cho trình thiết kế GUI nhận ra những gì bạn muốn. Nhưng tôi không biết cách thiết kế GUI tạo SSDL trong trường hợp cụ thể của StoreGeneratedPattern. –

0

Dấu thời gian là một kiểu dữ liệu khác với Ngày giờ. Dấu thời gian dường như được công nhận là thuộc tính mà công cụ quản lý, giống như thuộc tính nhận dạng. Bạn không thể "cập nhật" thuộc tính dấu thời gian. Do đó, EDM có thể quản lý nó một cách chính xác (giống như nó nhận dạng).

0

Bạn có thể sửa đổi mẫu văn bản để bỏ qua các cột này khi tạo các lớp thực thể của bạn. Ví dụ: nếu bạn đã thêm "IGNORE" vào tóm tắt tài liệu, bạn có thể sửa đổi mẫu để bỏ qua chúng bằng cách thay thế;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity) 

với;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity).Where(Function(p) p.Documentation is nothing orelse p.Documentation.Summary.IndexOf("IGNORE")<0) 
Các vấn đề liên quan