2010-09-28 45 views
5

Có cách nào để lấy cột dữ liệu DataType chiều dài thông tin được cung cấp cho một EntityType của bảng không?Khung thực thể - cách lấy kiểu dữ liệu cột cơ sở dữ liệu từ siêu dữ liệu

Ví dụ SQL (SQL Server) mà bạn có thể chạy để xem chính xác những thông tin tôi đang tìm kiếm:

select 
    sys.tables.name as 'Table Name', 
    sys.columns.name as 'Column Name', 
    sys.systypes.name as 'DataType', 
    sys.columns.max_length as 'Max Length', 
    sys.columns.precision as 'Precision' 
from 
    sys.columns, sys.systypes, sys.tables 
where 
    sys.columns.system_type_id = sys.systypes.xtype 
    and sys.systypes.name <> 'sysname' 
    and sys.tables.type = 'U' 
    and sys.tables.name <> 'sysdiagrams' 
    and sys.columns.object_id=sys.tables.object_id 
order by 
    sys.tables.name, sys.columns.column_id; 

3 cột cuối cùng chứa dữ liệu mà tôi muốn được tiếp cận với vì tôi tạo ra một số tài liệu. Một lý do ví dụ cho tài liệu là: Entity Framework sẽ ném một ngoại lệ theo mặc định nếu một chuỗi được đặt trên thuộc tính không thể hỗ trợ độ dài của nó. Nhà phát triển không có quyền truy cập vào siêu dữ liệu của cơ sở dữ liệu có thách thức với khả năng phát hiện các yêu cầu về độ dài trong trường hợp này.

Xin cảm ơn, Aaron

Trả lời

3

Thật không may là không.

Ngay cả khi thông tin đó được ghi chính xác trong SSDL (nghĩa là ngôn ngữ định nghĩa giản đồ lưu trữ) thì không có API công khai trong EF để chuyển từ thuộc tính C-Space (mô hình khái niệm) sang cột S-Space (mô hình lưu trữ).

Nếu mô hình của bạn đơn giản, bạn có thể suy ra thông tin đó, sử dụng không gian làm việc siêu dữ liệu EF và một số chẩn đoán đơn giản, nhưng một khi mọi thứ trở nên phức tạp hơn, các chẩn đoán đó sẽ bị hỏng.

Tùy chọn duy nhất của bạn tại thời điểm đó là viết mã để giải thích các tệp MSL (ánh xạ hoặc CS-Space) và sử dụng kết hợp với MetadataWorkspace để chuyển từ C-Space sang S-Space.

CHỈNH SỬA: như được chỉ ra bởi KristoferA bạn thường có thuộc tính trên thuộc tính C-Space, vì vậy bạn có thể truy cập trực tiếp vào thuộc tính đó. Thật không may là không phải luôn luôn như vậy, và thường nó không đồng bộ với cơ sở dữ liệu.

+0

... Nhưng có những thuộc tính mô hình khái niệm có chứa thông tin đó cho các lĩnh vực nơi mà nó được áp dụng. Giả sử thông tin đó được cập nhật, bạn có thể tải nó từ CSDL thay vì phải tra cứu các ánh xạ, v.v. – KristoferA

+0

Tuyệt đối. Tôi có nghĩa là để đề cập đến điều này ... –

+0

Btw, nếu/khi những thuộc tính có được ra khỏi đồng bộ nó là một khoe để cập nhật chúng một lần nữa với các mô hình so sánh trong add-in của tôi ... (http://huagati.blogspot.com /2010/07/introducing-model-comparer-for-entity.html) – KristoferA

0

Tôi chắc chắn rằng Julie Lerman's book trình bày cách lấy maxlength, ít nhất một công cụ để xác thực, bằng cách thực hiện các thay đổi trong quá trình tạo POCO. Chương 13, bắt đầu xung quanh trang 356. Ví dụ 13-12 bao gồm nó, nó bắt đầu với chất liệu

string MaxLengthValidation(EdmProperty prop)... 

đó có bản quyền vì vậy tôi sẽ không cắt/dán nó, nhưng tôi hy vọng bạn có thể mua một bản sao của cuốn sách của cô và lấy thông tin.

0

Có, đây là khả năng: (EF6.1)

<Extension> 
Public Function GetColumns(Of TEntity)(Db As IObjectContextAdapter) As List(Of DataColumn) 
    Dim oMetadata As MetadataWorkspace 
    Dim oObjects As ObjectItemCollection 
    Dim oContext As ObjectContext 
    Dim oColumn As DataColumn 
    Dim oQuery As Func(Of EdmProperty, Boolean) 
    Dim oType As EntityType 

    GetColumns = New List(Of DataColumn) 

    oContext = Db.ObjectContext 
    oMetadata = oContext.MetadataWorkspace 
    oObjects = oMetadata.GetItemCollection(DataSpace.OSpace) 

    oType = oMetadata.GetItems(Of EntityType)(DataSpace.OSpace). 
    Single(Function(EntityType As EntityType) oObjects.GetClrType(EntityType) Is GetType(TEntity)) 

    oQuery = Function(EdmProperty As EdmProperty) EdmProperty.DeclaringType.Name = oType.Name 

    oType.Properties.ToList.ForEach(Sub(Column As EdmProperty) 
            oColumn = New DataColumn With 
               { 
               .AutoIncrement = Column.IsStoreGeneratedIdentity, 
               .AllowDBNull = Column.Nullable, 
               .ColumnName = Column.Name, 
               .DataType = Column.PrimitiveType.ClrEquivalentType, 
               .Caption = Column.Name 
               } 

            If oColumn.DataType Is GetType(String) Then 
             oColumn.MaxLength = Column.MaxLength.GetValueOrDefault 
            Else 
             oColumn.MaxLength = -1 
            End If 

            GetColumns.Add(oColumn) 
            End Sub) 
End Function 
Các vấn đề liên quan