2010-10-26 30 views
14

Đây hoàn toàn là ý tưởng thiết kế và khái niệm liên quan đến EF4.Sửa đổi mô hình khung thực thể tại thời gian chạy

Ví dụ/kịch bản là hệ thống ERP hoặc CRM lớn, nơi các công ty có thể cần phải thêm "trường do người dùng xác định" truyền thống để nắm bắt dữ liệu bổ sung.

Tôi biết rằng EF có một số khả năng để đẩy mô hình vào cơ sở dữ liệu trong thời gian chạy nhưng câu hỏi thực sự là bạn có thể sử dụng EF để sửa đổi mô hình và cập nhật kho dữ liệu trong thời gian thực không?

Nói cách khác, nếu tôi cung cấp cho người dùng một cơ chế để thêm cột do người dùng xác định, loại dữ liệu liên quan và yêu cầu null có thể được thực hiện khi đang bay với EF và sau đó được ghi nhớ cho tất cả các phiên trong tương lai?

Nó ở ngoài đó nhưng tôi nghĩ tất cả các bạn sẽ thấy những gì tôi nhận được.

Brent

+0

Vì vậy, bạn đã kết thúc với giải pháp nào? – Guillaume

+0

Tôi thì không. Không bao giờ có thể kiểm tra hoặc nhận được bất cứ điều gì để làm việc. Tôi đã kết thúc với mã-đầu tiên trong thời gian dài anyway. –

Trả lời

14

Tôi đã được hỏi câu hỏi này một vài lần trong quá khứ. Không có cách rõ ràng hoặc dễ dàng. Có thể không có cách nào nhưng chúng tôi là nhà phát triển và luôn có cách! Tôi có biết đó là gì không? Tôi có thể mơ ước một số ý tưởng không? .... Mmmm .. khi chạy, mô hình dựa trên các lớp được đánh máy mạnh mẽ từ metadataworkspace. Bạn có thể tạo chúng ngay lập tức. Nhưng sau đó bạn cần phải sửa đổi xml của tập tin edmx.There LINQ thành XML hoặc xpath cho điều đó. Sửa đổi lược đồ cơ sở dữ liệu ... làm thế nào để mô hình đầu tiên xây dựng dbs ... nó tạo sql và sau đó bạn thực hiện nó. Bạn sẽ phải tạo sql (làm thế nào? Nhún vai) và thực hiện nó (objectcontext.executestorecommand()). Khả thi? Khả thi? Tôi không có đầu mối. Thực sự câu trả lời là không ... không có gì trong VS hoặc .NET 4 (EF APIs) để dễ dàng cho phép điều này theo như tôi biết. Chắc chắn một người thông minh hơn và kiên nhẫn hơn tôi đã bỏ ra (lãng phí ??) rất nhiều thời gian (cố gắng) outsmart EF để kéo nó đi. Dựa trên, tuy nhiên, trên phản ứng của bạn t đề nghị lại bài viết blog của Jeremy, bạn đang tìm kiếm một cái gì đó được xây dựng trong/tiện dụng. Đó là dễ dàng hơn để trả lời với một "nope".

julie

+7

Chào mừng bạn đến với SO, Julie! – Yakimych

+0

Tôi đang nghĩ một sự kết hợp của mã đầu tiên với 'ExpandoObject' có thể làm điều đó. Nhưng thay vì sửa đổi các trường do người dùng xác định, điều đó có ý nghĩa hơn đối với tôi để coi chúng là không chuẩn. +1 cho Yakimych; chào mừng bạn! –

+0

Tôi đồng ý rằng nó sẽ dễ dàng hơn với mã đầu tiên và KHÔNG có mô hình nào cả, một lớp ít phức tạp hơn và quy tắc để xử lý wtih Nhưng hãy làm rất nhiều công việc –

1

Jeremy Miller thảo luận về thiết lập tương tự trong this article. Anh ấy đang sử dụng nHibernate, nhưng nó có thể cung cấp cho bạn một số ý tưởng.

+0

Vâng, nó mang lại cho tôi một số ý tưởng, không ai trong số đó là đơn giản. Tôi ngạc nhiên yêu cầu này không phổ biến với nHibernate hoặc EF cho vấn đề đó. Bất kỳ tài nguyên hoặc ý tưởng nào khác? Đã không thực sự trả lời câu hỏi vừa cung cấp một tham chiếu, khó đóng câu hỏi cho điều đó. –

+0

tôi nghĩ về việc đó nhưng kịch bản của tôi có nghĩa là tôi phải cho phép người dùng thêm "nhân viên" vào vị trí đầu tiên trước khi xác định các trường tùy chỉnh ... theo nghĩa là ngay cả bảng là tùy chỉnh. – War

11

Thường có nhiều cách để giải quyết vấn đề và đây không phải là ngoại lệ. Trong trường hợp này, những gì bạn đang tìm kiếm là cho phép người dùng thêm các trường mới vào ứng dụng và cơ sở dữ liệu của bạn và sử dụng các trường đó từ bên trong ứng dụng của bạn. Một số cách để làm điều đó là:

a) Cho phép người dùng sửa đổi giản đồ cơ sở dữ liệu.
b) Tạo cấu trúc riêng để xác định 'trường do người dùng xác định' và lưu trữ dữ liệu trong đó.
c) Tạo các trường 'được bảo lưu' không có giá trị trong các bảng nơi người dùng có nhiều khả năng cần các trường của riêng họ hơn.

Tôi thích (b) phương pháp tiếp cận và đôi khi (c) cách tiếp cận bất cứ khi nào người dùng xác định các trường tùy chỉnh là cần thiết trong một ứng dụng. Dưới đây là một số trong những ưu/khuyết điểm cho mỗi ba:

Sửa schema

Risky: Nếu bạn cho phép người dùng chỉnh sửa database schema, nơi nào bạn vẽ đường? Nếu họ có thể thêm các trường, chúng cũng có thể thay đổi định nghĩa của các trường hiện có, thêm hoặc loại bỏ các chỉ mục, v.v. Điều này có thể dẫn đến cơn ác mộng hỗ trợ với lỗi, các vấn đề về hiệu suất, vv.
Biểu diễn: lưu trữ nội dung do người dùng xác định mới trong bảng hiện có thường có lợi thế về hiệu suất qua cấu trúc riêng biệt, nhưng chỉ miễn là chúng không bị thay đổi quá mức.
Clunky: EF xác định lược đồ tại thời điểm thiết kế, vì vậy để thực hiện công việc này trong thời gian chạy, bạn sẽ cần phải tạo các lớp thực thể mới trong thời gian chạy với các thành viên đại diện cho các trường mới và bạn cần cập nhật siêu dữ liệu bản đồ tại thời gian chạy. Các lớp thực thể được tạo thời gian chạy có thể kế thừa từ các lớp được tạo theo thời gian thiết kế, do đó bạn chỉ cần thêm các thành viên và ánh xạ cho các trường do người dùng định nghĩa mới. Mặc dù có thể, nó là clunky. Mã sử ​​dụng các lớp được tạo theo thời gian chạy sẽ cần sử dụng sự phản chiếu để truy cập các thành viên mới được tạo ra trong thời gian chạy.

cấu trúc riêng biệt

người dùng thân thiện: Bằng cách tạo ra một cấu trúc riêng biệt để lưu trữ các lĩnh vực tùy chỉnh, bạn có thể xây dựng logic ứng dụng cho người dùng thêm/gỡ bỏ những lĩnh vực vv Họ không cần phải gây rối với cơ sở dữ liệu, thay vào đó bạn có thể có biểu mẫu bảo trì trong ứng dụng để thêm các trường mới.
Thân thiện với EF: không cần phải gây rối với các lớp thực thể và siêu dữ liệu bản đồ khi chạy. Mọi thứ được định nghĩa tại thời điểm thiết kế và các trường do người dùng định nghĩa chỉ là dữ liệu.
Hiệu suất kém hơn: Việc có các bảng riêng biệt để xác định và lưu trữ các trường do người dùng xác định có thể khiến việc tra cứu tốn kém hơn một chút do các chuyến đi bổ sung hoặc tham gia bổ sung.

Separate table structure for user defined fields

lĩnh vực reserved

Thường đủ: Trong nhiều tình huống, các trường tùy chỉ được sử dụng cho một hoặc một vài trường bổ sung. Dự trữ một vài cột thường sẽ bao gồm 99% nhu cầu của người dùng. Ngay cả một trường "nhận xét" chung trong mỗi bảng thường đủ trong các ứng dụng LOB.
Limited: Nếu người dùng muốn nhiều trường hơn số bạn đã đặt trước hoặc các loại dữ liệu khác mà bạn đã đặt trước thì đó có thể là giới hạn.
Người biểu diễn: Cột nội tuyến, được truy xuất mà không cần thêm vòng hoặc gia nhập.
Được xác định tại thời điểm thiết kế: Không có thời gian chạy rối tung với định nghĩa loại hoặc ánh xạ loại thực thể.

Reserved fields

2

Brent ping tôi trên Twitter ngày hôm nay (gần 2 năm sau khi bài này) để xem nếu bất cứ điều gì đã thay đổi. Kịch bản này vẫn chưa được EF hỗ trợ. Tuy nhiên, Rowan Miller có một bài đăng thú vị về cách thức để giải quyết vấn đề này với Mã số Đầu tiên http://romiller.com/2012/03/26/dynamically-building-a-model-with-code-first/

Điều này có thể hoặc không thể làm những gì bạn cần nhưng đáng xem.

0

Đây là phiên bản Reserved fields từ @KristoferA câu trả lời mà tôi đã sử dụng trong quá khứ.

Bạn có thể thêm một cột XML (hoặc JSON) bổ sung trên mỗi bảng có khả năng yêu cầu dữ liệu tùy chỉnh và sau đó đọc/ghi nó từ db sử dụng EF.Sau khi đọc deserialize XML (JSON) và chuyển nó đến cơ chế được cho là để xử lý các ánh xạ sau đó trình bày nó cho người dùng. Cùng đi viết dữ liệu bạn đọc nó từ giao diện người dùng -> ánh xạ tới đối tượng -> tuần tự hóa thành XML (JSON) -> và ghi vào các trường bổ sung này.

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