Trong trường hợp nó giúp bất cứ ai, tôi cần thiết để có thể làm điều này mà không có sự hiểu biết các loại trước đó (vì vậy tôi không thể dễ dàng làm CreateObjectSet<YourEntity>()
vì tôi không biết YourEntity
), vì vậy tôi đã có thể thích ứng @Ladislav 's giải pháp như sau:
// variable "type" is a System.Type passed in as a method parameter
ObjectContext objectContext = ((IObjectContextAdapter)this.context).ObjectContext;
IEnumerable<string> retval = (IEnumerable<string>)objectContext.MetadataWorkspace
.GetType(type.Name, type.Namespace, System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace)
.MetadataProperties
.Where(mp => mp.Name == "KeyMembers")
.First()
.Value;
có vẻ loại lẻ mà đòi hỏi MetadataWorkspace.GetType
chuỗi của tên loại và không gian tên, thay vì một System.Type, nhưng đó là tốt nhất mà tôi có thể tìm thấy.
Nguồn
2014-08-20 10:01:01
Thx. được đánh dấu là câu trả lời. Tôi muốn bình luận rằng đó là một ý tưởng tốt hơn để thêm một giao diện vào lớp ngữ cảnh của bạn (ví dụ, IYourDataContext) và kế thừa IObjectContextAdapter với IYourDataContext đó. Bằng cách đó bạn không phải bỏ nó. –
Với điều này là 5 tuổi bây giờ, có cách nào để làm điều này mà không phản ánh nặng? Ngữ cảnh của câu hỏi của tôi là một nỗ lực để thực hiện một phương thức Find mà không theo dõi, chẳng hạn như SingleOrDefault() nhưng trong một lớp cơ sở không thể giả định để biết tên khóa của thực thể đó. Cảm ơn các bạn. –
cảm ơn rất nhiều, làm việc như một say mê –