如何通过ID获取添加方法?

时间:2012-11-22 20:27:47

标签: c# entity-framework generics

我有普通班。 我需要通过ID创建方法get seingleOrDefault吗?

怎么做?

public T GetByID(int id)
{
    _entities.Set<T>().Single(x => x.);
}

普通班:

   public abstract class GenericRepository<C, T> : IGenericRepository<T>
        where T : class
        where C : DbContext, new()
    {

        private C _entities = new C();
        public C Context
        {

            get { return _entities; }
            set { _entities = value; }
        }

        public virtual IQueryable<T> GetAll()
        {

            IQueryable<T> query = _entities.Set<T>();
            return query;
        }

        public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {

            IQueryable<T> query = _entities.Set<T>().Where(predicate);
            return query;
        }

        public virtual void Add(T entity)
        {
            _entities.Set<T>().Add(entity);
        }

        public virtual void Delete(T entity)
        {
            _entities.Set<T>().Remove(entity);
        }

        public virtual void Edit(T entity)
        {
            _entities.Entry(entity).State = System.Data.EntityState.Modified;
        }

        public virtual void Save()
        {
            _entities.SaveChanges();
        }
    }

2 个答案:

答案 0 :(得分:4)

如果您使用DbContext,则方法Set<T>()会返回DbSet<T>而不是ObjectSet<T>DbSet<T>方法DbSet<T>.Find(params object[] keyValues)完全符合您的目标:

  

此方法使用主键值尝试查找由其跟踪的实体   上下文。如果实体不在上下文中,则查询将是   根据数据源中的数据执行和评估,并为null   如果在上下文或数据中找不到实体,则返回   源。

用法:

public T GetByID(int id)
{
    return _entities.Set<T>().Find(id);
}

答案 1 :(得分:0)

如果您想以通用方式执行此操作,则需要在T上添加通用约束。

这样的东西
public interface IEntity
{
    int Id { get; set; }
}

public abstract class GenericRepository<C, T> : IGenericRepository<T>
    where T : class, IEntity
    where C : DbContext, new()
{
    public T GetByID(int id)
    {
        _entities.Set<T>().SingleOrDefault(x => x.Id == id);
    }

    ...

}