entity-framework - 如何使用 Entity Framework 4 和存储库模式实现通用 GetById 方法?

标签 entity-framework entity-framework-4 repository-pattern

我有一个通用存储库,并希望实现一个通用 GetById 方法。到目前为止,这是我的存储库界面:

public interface IRepository<T> where T : EntityObject  
{
    void Add(T entity);
    void Delete(int id);
    void Delete(T entity);
    IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
    T SingleOrDefault(Expression<Func<T, bool>> predicate);
    IEnumerable<T> GetAll();
    T GetById(int id);
    void Save();
    T Single(Expression<Func<T, bool>> predicate);
}

我正在使用 Entity Framework 4.1。我发现的许多解决方案都是为 IEntity 类使用接口(interface)的抽象基类,实体必须从该类继承才能执行 Id 查找。

我不必为我的所有类实现一个接口(interface),而是尝试使用这段代码:
T entity = _objectSet.Where(
    x => x.EntityKey.EntityKeyValues
          .Select(v => v.Value.Equals(id)).Count() == 1).First();

但是,当尝试使用该方法时,我收到异常:
The specified type member 'EntityKey' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
有人能告诉我如何让它工作吗?

更新 1

成员 _objectContext 和 _context 声明如下:
private readonly ObjectContext _context;
private readonly IObjectSet<T> _objectSet;

谢谢。

最佳答案

从这个问题 How to get ObjectSet<T>'s entity key name? ,您可以稍微作弊并使用 ESQL。

    public T GetById(int id)
    {

        var keyPropertyName = _objectSet.EntitySet.ElementType.KeyMembers[0].ToString();        

        T entity = _objectSet.Where("it." + keyPropertyName + "=" + id).First();
        return entity;

    }

我已经在方法中包含了所有需要的代码,显然你想稍微重构一下,但它应该适合你。

关于entity-framework - 如何使用 Entity Framework 4 和存储库模式实现通用 GetById 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527311/

相关文章:

entity-framework-4 - Entity Framework 4中的组合问题 : The entity is currently read-only

entity-framework - 架构无效且类型无法加载,因为程序集包含 EdmSchemaAttribute

asp.net-mvc - 将我的 DbContext 包装在一个工作单元类中是个好主意吗?

c# - Entity Framework 异步方法是否使用 ThreadPool 线程?

c# - SQL 监控和插入

sql - 从 Code First 创建的数据库显示在服务器资源管理器中,而不是 SQL Server 对象资源管理器中

.net - EF 4.0 支持哪些功能?

.net - ASP.NET MVC : Service layer, 数据层和 Controller - 它们如何一起通信?

c# - IdentityDbContext 如何配置迁移

entity-framework - 为什么 Entity Framework ?