2010-06-21 47 views
2

我有x个表和所有表都有一个uniqueidentifier/guid主键。我想编写一个通用的功能,将采取一个GUID PARAM id其中T是EntityObject是这样的...EF4通用搜索ID

public T SelectById<T>(Guid id) where T : EntityObject 

看起来这是一个简单的事情。我搜索了互联网,无法找到办法做到这一点,更不用说是一种优雅的方式。我在这里错过了什么,为什么这很困难?

回答

3

为了实现这一点,您需要确保您的实体上的ID属性符合命名约定,如Id或EntityName_Id。然后你所要做的就是使用一点反射来建立EntityKey。

  ObjectStateEntry entry; 

     var entityKey = new EntityKey(Context.DefaultContainerName + "." + typeof(T).Name, "Id", id); 

     object entity = null; 
     if (!Context.ObjectStateManager.TryGetObjectStateEntry(entityKey, out entry) || entry.Entity == null) 
     { 
      try 
      { 
       entity = Context.GetObjectByKey(entityKey);  
      } 
      catch (ObjectNotFoundException) 
      { 

      } 

     } 

     return (T)entity;