EntityFramework Get object by ID? EntityFramework Get object by ID? asp.net asp.net

EntityFramework Get object by ID?


You can define interface implemented by all your entities:

public interface IEntity{    int Id { get; }}

and method to retrieve your entity:

public T GetObjectById<T>(int id) where T : class, IEntity{    return context.CreateObjectSet<T>().SingleOrDefault(e => e.Id == id);}

You can also use similar approach to one provided in the linked question. You just have to use another method to get your entity:

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);         }

The difference is that first method always query the database even if you have already loaded the instance to the context whereas second approach first checks if the instance is already loaded. The method is not so efficient because it builds these names over and over. Here is more general approach which can work with any key type and name and here is approach working with complex keys.

Neither of this method directly works with inheritance - you must provide base type to make it work.


I think the Find() method may be able to do what you're looking for (DbSet.Find Method).

var someEntity = dbSet.Find(keyValue);


It's hard to make a completely generic solution because Entities can have composite keys, but this will work for a simple single key case.

The key is to restrict T to be of type System.Data.Objects.DataClasses.EntityObject, which then has as EntityKey property (which represents the primary key).

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);    }}