EntityFramework通过ID获取对象?

| 泛型是否可以在不知道类型的情况下从我的EntityFramework获取对象? 我正在考虑以下方面的内容:
public T GetObjectByID<T>(int id)
{
   return (from i in myDatabase.T where i.ID == id select i);
}
那可行吗?我可以用Reflection取take1并用于桌子吗? 编辑 另一个麻烦之处在于,并非我可用的所有表都使用\“ ID \”作为其唯一列名。     
已邀请:
        您可以定义由所有实体实现的接口:
public interface IEntity
{
    int Id { get; }
}
和检索您的实体的方法:
public T GetObjectById<T>(int id) where T : class, IEntity
{
    return context.CreateObjectSet<T>().SingleOrDefault(e => e.Id == id);
}
您也可以对链接的问题中提供的方法使用类似的方法。您只需要使用另一种方法来获取您的实体:
public virtual T GetByKey<T>(int id) where T : class, IEntity
{
     string containerName = context.DefaultContainerName;
     string setName = context.CreateObjectSet<T>().EntitySet.Name;
     // Build entity key
     var entityKey = new EntityKey(containerName + \".\" + setName, \"Id\", id);
     return (TEntity)Context.GetObjectByKey(entityKey);         
}
区别在于,即使您已经将实例加载到上下文中,第一种方法也始终查询数据库,而第二种方法首先检查实例是否已加载。该方法效率不高,因为它会一遍又一遍地建立这些名称。这是可以与任何键类型和名称一起使用的更通用的方法,而这是与复杂键一起使用的方法。 这两种方法都不能直接与继承一起使用-您必须提供基本类型才能使其起作用。     
        我认为
Find()
方法可能可以满足您的需求(DbSet.Find方法)。
var someEntity = dbSet.Find(keyValue);
    
        很难制作出一个完全通用的解决方案,因为实体可以具有复合键,但是这对于简单的单个键来说是可行的。 关键是将
T
限制为
System.Data.Objects.DataClasses.EntityObject
类型,然后将其具有
EntityKey
属性(代表主键)。
static T GetById<T>(object id) where T : EntityObject
{
    using (var context = new MyEntities())
    {
        return context.CreateObjectSet<T>()
            .SingleOrDefault(t => t.EntityKey.EntityKeyValues[0].Value == id);
    }
}
    
        终于解决了这个问题: http://pastebin.com/kjXUKBNS 要调用代码,我使用以下代码:
// Get the id of the object we are saving
PropertyInfo prop = GetProperty<TEntity>(entity, entity.EntityKey.EntityKeyValues[0].Key);
string entityID = prop.GetValue(entity, null).ToString();

// Get the current version of this object
var originalEntity = GetEntity<TEntity>(PropertyEquals, entityID);
这假定您要搜索的主键是主键列表中的第一个。     
        在实体框架上从id获取实体的另一种方法
public T Get<T>(int id) where T : EntityObject;
{
var ObjectSet = _context.CreateObjectSet<T>();
var PropName = ObjectSet.EntitySet.ElementType.KeyMembers[0].ToString();
return  ObjectSet.Where(\"it.\" + PropName + \"=\" + id).FirstOrDefault();
}
结果
SELECT TOP (1) 
[Extent1].[CatId] AS [CatId], 
[Extent1].[CatName] AS [CatName], 
[Extent1].[CatType] AS [CatType],  
FROM [dbo].[Categories] AS [Extent1]
WHERE [Extent1].[CatId] = 1
    
        我认为这可能会有所帮助
public static TEntity Find<TEntity>(this ObjectSet<TEntity> set, object id) where TEntity : EntityObject
    {
      using (var context = new MyObjectContext())
      {
        var entity = set.Context.CreateObjectSet<TEntity>();
        string keyName = entity.FirstOrDefault().EntityKey.EntityKeyValues.FirstOrDefault().Key;

        return entity.Where(\"it.\" + keyName + \" = \" + id).FirstOrDefault();
      }
    }
    
        我已经完成的一件事就是定义一个\“ KeyComparator \”接口:
public interface IHasKeyComparator<TObject> {
   Expression<Func<TObject, bool>> KeyComparator { get; } 
}
然后,即使使用多值键,也可以在某些对象上实现它:
public sealed class MultiKeyedObject : IHasKeyComparator<MultiKeyedObject> {
   public int ID1 { get; set; }
   public string ID2 { get; set; }       

   readonly Expression<Func<MultiKeyedObject, bool>> mKeyComparator;

   public Expression<Func<MultiKeyedObject, bool>> KeyComparator {
      get { return mKeyComparator; }
   }

   public MultiKeyedObject() {
      mKeyComparator = other => other.ID1 == ID1 && other.ID2 == ID2;
   }
}
如果提供约束,则可以通用地使用它:
public TObject Refresh<TObject>(TObject pObject)
where TObject : IHasKeyComparator<TObject> {
   return this.Set<TObject>().Single(pObject.KeyComparator);
}
尽管您可以用键值填充一个空对象,然后使用它从数据库中提取一个对象,但是以这种方式进行操作需要您拥有该对象的一个​​实例。     
        这是我用来通过ID获取Entity对象的方法。
public TEntity GetByKey<TEntity>(object keyValue) where TEntity : class
    {            
        EntityKey key = GetEntityKey<TEntity>(keyValue);

        object originalItem;
        if (ObjectContext.TryGetObjectByKey(key, out originalItem))
        {
            return (TEntity)originalItem;
        }
        return default(TEntity);
    }
您可能会发现此解决方案比上面提供的解决方案更可靠。我已经在许多项目中将其用作通用存储库的一部分。希望它可以帮助您。     

要回复问题请先登录注册