2010-12-08 20 views
7

Có ai biết cách lấy thông tin lược đồ ra khỏi Khuôn khổ thực thể được tạo ra bằng edmx không? Cụ thể tôi muốn quản lý để đi qua khóa ngoại cho một thực thể mà tôi hiện không có một thể hiện và nhận được các mối quan hệ khóa ngoài của nó, và tôi muốn làm điều này thông qua sự phản ánh theo cách sẽ thường được áp dụng cho bất kỳ lớp thực thể nào mà không có mã tùy chỉnh mỗi lần.Đọc siêu dữ liệu khóa ngoại theo lập trình với Entity Framework 4

EG: Giản đồ của tôi có 2 lớp, Người dùng và Nhóm. Tôi có số "42" mà tôi biết đến từ thuộc tính "GroupId" của thực thể "Người dùng", nhưng tại thời điểm này tôi không thể tìm ra cách phát hiện thuộc tính "GroupId" này của khóa ngoại "Người dùng" thành thực thể "Nhóm" theo thuộc tính "GroupId".

Trả lời

7

Đã kết thúc tìm giải pháp cho điều này. Có thể tìm thấy thông tin liên quan trong thuộc tính RelationshipManager của ngữ cảnh. Bằng cách gọi số GetAllRelatedEnds() và sau đó tìm số của loại AssociationSet.

Các ElementType của hiệp hội thiết lập sau đó chứa một tài sản IsForeignKey và cũng là một mảng ReferentialConstraints có thuộc tính cho mỗi chế ToRole, ToProperty, FromRoleFromProperty tương ứng, và RelationshipMultiplicity trên ToRole/FromRole thể được sử dụng để xác định hướng của mối quan hệ khóa ngoại.

Lấy tất cả dữ liệu này và sử dụng phương thức GetObjectByKey của bối cảnh tôi có thể theo dõi một cách có lập trình các mối quan hệ khóa ngoài được xác định cho ngữ cảnh mà không có thực thể liên quan.

+1

tôi không thể có được điều này để làm việc. Tôi không thể tìm thấy một thuộc tính RelationshipManager trên bối cảnh (mặc dù tôi có thể lấy nó bằng CType (tableObject, IEntityWithRelationships) .RelationshipManager), và sau đó sau khi thực hiện điều đó, tôi không thể tìm thấy kết quả từ GetRelatedEnds có thể được đưa vào AssociationSet. Một ví dụ mã sẽ được đánh giá cao. – pbarranis

+1

Xin lỗi, xin lỗi vì câu trả lời chậm trễ - tôi đã không đọc nó trong một thời gian dài. Tôi nên rõ ràng hơn là tôi đang làm việc từ một ObjectStateEntry trái với trực tiếp từ Bối cảnh. Cú pháp chính xác mà tôi đã sử dụng từ đó là "foreach (AssociationSet assoc in ose.RelationshipManager.GetAllRelatedEnds(). Chọn (end => end.RelationshipSet) .Where (rs => rs là AssociationSet && ((AssociationSet) rs) .ElementType. IsForeignKey) .Cast ()) ", sau đó tôi đã có một số logic bổ sung để làm việc ra bên đó là nguyên nhân tôi chỉ muốn cụ thể đa số của các phím nước ngoài. – fyjham

21

Bạn có thể sử dụng các phương pháp sau đây -

foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) 
foreach (var entityMember in entity.NavigationProperties) 
foreach (System.Data.Metadata.Edm.EdmProperty foreignKey in entityMember.GetDependentProperties()) 
{ 
    //... use foreignKey 
} 
+2

Tuyệt vời - cảm ơn bạn! Tôi không biết làm thế nào để có được câu trả lời của poster để làm việc, nhưng bạn đã làm việc lần đầu tiên. A + cho ví dụ mã quá! – pbarranis

+2

Thật tuyệt. Ít nhất là vì việc tìm kiếm thông tin liên quan cho nội dung này trên Google là cực kỳ khó khăn. –

+0

Tương tự ở đây. Cảm ơn bạn! –

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