2010-04-21 15 views
12

Với một EntityType, chẳng hạn như "Liên hệ", làm thế nào tôi có thể lấy được từ tên của EntitySet nó sẽ thuộc về, tức là số nhiều như "Liên hệ"?Lấy tên EntitySet từ một EntityType trong EF

+0

Tôi đoán bạn không có một thể hiện của đối tượng? – Nix

+0

@Nix Tôi cũng có cùng một vấn đề, Loại của tôi là T param, vì vậy chắc chắn không có trường hợp của đối tượng? –

+0

Tôi phải bình luận và cảm ơn vì điều này, bởi vì tôi đã gặp phải vấn đề tương tự EXACT của 'Contacts' và 'Contact' – cost

Trả lời

30

Nếu bạn đã có một thực thể gắn liền (rõ ràng là bạn không cần dòng đầu tiên, chỉ cần sử dụng thực thể hiện tại của bạn):

Contact c = context.Contacts.Where(x => x.blah).FirstOrDefault(); 
    string setName = c.EntityKey.EntitySetName; 

Hoặc nếu bạn không:

string className = typeof(Contact).Name 
var container = 
    context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
    string setName = (from meta in container.BaseEntitySets 
              where meta.ElementType.Name == className 
              select meta.Name).First(); 
+0

Rất hay. Tôi cần điều này để thực hiện các tùy chỉnh bổ sung của các thực thể POCO, như thêm các phương thức GetById() cho tất cả các lớp thực thể. –

+0

Genius, tôi đã cố gắng làm điều này cho các lứa tuổi, cảm ơn rất nhiều, +1 cho một câu trả lời tuyệt vời –

+0

Lưu ý rằng các truy vấn CSpace chỉ hoạt động khi bạn kết nối với cơ sở dữ liệu, vì vậy nó sẽ không hoạt động trong các tình huống mà bạn chỉ muốn truy vấn các loại trực tiếp. –

6

Phần mở rộng này có thể hữu ích

public static class MyExtensions 
{ 
    public static string GetEntitySetName<T>(this ObjectContext context) 
    { 
     string className = typeof(T).Name; 

     var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
     string entitySetName = (from meta in container.BaseEntitySets 
           where meta.ElementType.Name == className 
           select meta.Name).First(); 

     return entitySetName; 
    } 
} 

Và sử dụng nó như:

db.AttachTo(db.GetEntitySetName<MyEntityType>(), myEntityInstance); 
Các vấn đề liên quan