5

Tôi có một vấn đề khó khăn khi tôi muốn sử dụng sự phản chiếu trên ánh xạ khung thực thể của mình để tìm tất cả các khóa ngoài tham chiếu bảng và tôi muốn tên của các cột đó là các khóa ngoại.Khung thực thể - Phản ánh về các khóa và mối quan hệ nước ngoài

Theo another post on SO, tôi có thể dễ dàng tìm thấy thuộc tính điều hướng trên bảng thông qua phản ánh. Nhưng điều này không cho tôi tên của thuộc tính hoặc cột có chứa giá trị khóa ngoại.

Lý do tôi đang cố gắng làm điều này là tôi có một số lượng lớn các bảng (gần 40) tham chiếu một bảng mục. Giả sử người dùng nhập một giá trị mới vào bảng mục có tên "Andew" và sau đó một quản trị viên nhận thấy đó thực sự chỉ là lỗi đánh máy cho mục đã tồn tại "Andrew". Bây giờ tôi muốn tìm tất cả các tham chiếu đến "Andew" và thay đổi các tham chiếu đó thành "Andrew". Tôi muốn làm điều này một cách hiệu quả, vì vậy việc sử dụng các thuộc tính điều hướng ngược sẽ quá chậm vì bạn phải tải các giá trị trước khi sửa đổi chúng. Những gì tôi muốn làm là có thể phản ánh một danh sách các bảng và các cột, sau đó phát hành các lệnh cập nhật trực tiếp vào cơ sở dữ liệu. Nó sẽ giống như thế này:

var command = String.Format("UPDATE [{0}] SET [{1}] = {{1}} WHERE [{1}] = {{0}}; ", fk.FromTableName, fk.FromColumnName); 
dataContext.ExecuteStoreCommand(command, new Object[] { oldID, newID }); 

Trong LINQ to SQL này đã thực sự khá dễ dàng ... 20 dòng suy tư về LINQ đang tự động tạo ra và tôi đã được thực hiện, nhưng chúng tôi chuyển sang EF thời gian gần đây và tôi không thể tìm thấy tên của các cột khóa ngoài thông qua EF.

Ví dụ đơn giản về những gì tôi đang tìm kiếm: nếu tôi có đối tượng được gọi là Nhân viên có thuộc tính điều hướng được gọi là Người quản lý và khóa ngoại của ManagerID, thì tôi muốn biết rằng Người quản lý là tài sản điều hướng của tôi và bộ nhớ cơ bản là thuộc tính ManagerID. Tôi muốn thực hiện điều này một cách nghiêm ngặt thông qua sự phản chiếu hoặc siêu dữ liệu để tôi có thể xây dựng một truy vấn dynmaic từ nó.

+1

bạn nhận được phiếu bầu xuống vì vậy tôi cho rằng tôi không phải là người duy nhất gặp khó khăn khi hiểu bạn đang làm gì. bạn có thể chỉ cần 'employee.managerId' hoặc' employee.manager.id'? bạn phải biết quy ước là gì, DBA của bạn không thể chỉ đơn giản là thay đổi DB mà không ảnh hưởng đến dự án của bạn theo những cách khác. – Eonasdan

+0

@Eonasdan - cảm ơn. Tôi đã tự hỏi tại sao tôi đã được downvoted. Tôi viết lại hoàn toàn để hy vọng làm cho nó rõ ràng hơn nhiều. Thật không may bây giờ nó dài hơn nhiều, và tôi đã cố gắng để giữ nó ngắn. – pbarranis

Trả lời

1

Một khi bạn đã sử dụng những ý tưởng trong câu hỏi liên quan để có được EntityType bạn quan tâm, lưu ý rằng EntityType thừa hưởng từ EntityTypeBase, trong đó có một tài sản KeyMembers mà là một tập hợp của tất cả các EdmMembers rằng tham gia vào khóa của thực thể.

Mỗi EdmMemberName sẽ là chuỗi "ManagerID" mà bạn tìm kiếm.

+1

Đó là một suy nghĩ tốt, nhưng tôi cần phải lấy tên của khóa ngoại trên đối tượng hiện tại, không phải là chìa khóa của đối tượng nước ngoài. Đó là sự khác biệt betwee myObject.ManagerID và myObject.Manager.ID. Chúng tôi không sử dụng quy ước của Manager.ManagerID - chúng tôi sử dụng Manager.ID - vì vậy các cột được đặt tên khác nhau trên mỗi đầu. – pbarranis

1

Chỉ để tiết kiệm thời gian, tôi muốn ném ra đây là không phải câu trả lời đúng, nhưng bạn có thể làm những gì tôi hỏi thông qua các khung nhìn hệ thống trong SQL. Tôi đã thử điều này và nó hoạt động, nhưng nó làm phiền tôi tôi có thể nhận được dữ liệu này dễ dàng thông qua LINQ to SQL, nhưng tôi không thể tìm thấy nó trong EF ở tất cả. Nếu không có cách nào khác, tôi sẽ phải sử dụng giải pháp dưới đây. (Nhưng EF phải có dữ liệu này trong nội bộ một nơi nào đó ... Tôi chỉ muốn truy cập vào dữ liệu đó.)

select K.name as RelationshipName, T1.name as FromTable, C1.name as FromColumn, T2.name as ToTable, C2.name as ToColumn 
from sys.foreign_keys as K 
join sys.foreign_key_columns as C on K.object_id = C.constraint_object_id 
join sys.columns as C1 on K.parent_object_id = C1.object_id 
join sys.tables as T1 on K.parent_object_id = T1.object_id 
join sys.columns as C2 on K.referenced_object_id = C2.object_id 
join sys.tables as T2 on K.referenced_object_id = T2.object_id 
where C1.column_id = C.parent_column_id 
and C2.column_id = C.referenced_column_id 
and T2.Name = 'Employee' 
order by T1.Name, C1.Name 

Hy vọng đăng câu trả lời sai này ít hữu ích cho người khác ngoài tôi ... (cũng chỉ FYI , giải pháp này cần nhiều mã hơn để làm việc với PK đa cột - tôi là tất cả các cột đơn).

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