通用存储库 EF4 CTP5 getById

发布于 2024-10-19 15:42:46 字数 843 浏览 1 评论 0原文

我有一个通用存储库,我正在尝试添加 GetById 方法,如下所示 C# LINQ to SQL:重构此通用 GetByID 方法问题

是我的存储库不使用 System.Data.Linq.DataContext 相反,我使用 System.Data.Entity.DbContext

因此,我在尝试使用时遇到错误

Mapping.GetMetaType

return _set.Where( whereExpression).Single();

如何在 CTP5 中实现通用 GetById 方法?我应该在我的存储库中使用 System.Data.Entity.DbContext 吗?

这是我的存储库类的开始

  public class BaseRepository<T> where T : class
    {

        private DbContext _context;
        private readonly DbSet<T> _set;

        public BaseRepository()
        {
            _context = new MyDBContext();
            _set = _context.Set<T>();

        }

I have a generic repository an I am trying to add a GetById method as shown here
C# LINQ to SQL: Refactoring this Generic GetByID method

The problem is my repository does not use System.Data.Linq.DataContext
instead I use System.Data.Entity.DbContext

So I get errors where I try to use

Mapping.GetMetaType

and

return _set.Where( whereExpression).Single();

How can I implement a generic GetById method in CTP5? Should I be using System.Data.Entity.DbContext in my Repository.

Here is the start of my repository class

  public class BaseRepository<T> where T : class
    {

        private DbContext _context;
        private readonly DbSet<T> _set;

        public BaseRepository()
        {
            _context = new MyDBContext();
            _set = _context.Set<T>();

        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧故 2024-10-26 15:42:46

最基本的方法很简单,

public T GetById(params object[] keys)
{
  _set.Find(keys);
}

如果您知道所有实体都有名为 Id 的主键(它不必在数据库中称为 Id,但必须映射到属性 Id),您可以简单地使用以下内容:

public interface IEntity
{
  int Id { get; }
}

public class BaseRepository<T> where T : class, IEntity
{
  ...

  public T GetById(int id)
  {
    _set.Find(id);
  }
}

如果数据类型并不总是相同的,您可以使用:

public interface IEntity<TKey>
{
  TKey Id { get; }
}

public class BaseRepository<TEntity, TKey> where TEntity : class, IEntity<TKey>
{
  ...

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}

您也可以简单地使用:

public class BaseRepository<TEntity, TKey> where TEntity : class
{
  ...

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}

The most basic approach is simply

public T GetById(params object[] keys)
{
  _set.Find(keys);
}

If you know that all your entities have primary key called Id (it doesn't have to be called Id in DB but it must be mapped to property Id) of defined type you can use simply this:

public interface IEntity
{
  int Id { get; }
}

public class BaseRepository<T> where T : class, IEntity
{
  ...

  public T GetById(int id)
  {
    _set.Find(id);
  }
}

If data type is not always the same you can use:

public interface IEntity<TKey>
{
  TKey Id { get; }
}

public class BaseRepository<TEntity, TKey> where TEntity : class, IEntity<TKey>
{
  ...

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}

You can also simply use:

public class BaseRepository<TEntity, TKey> where TEntity : class
{
  ...

  public TEntity GetById(TKey id)
  {
    _set.Find(id);
  }
}
月朦胧 2024-10-26 15:42:46

试试这个

    public virtual T GetByID(object id)
    {

        // Define the entity key values.
        IEnumerable<KeyValuePair<string, object>> entityKeyValues =
            new KeyValuePair<string, object>[] { 
            new KeyValuePair<string, object>("Id", id) };

        string qualifiedEntitySetName = _context.DefaultContainerName + "." + typeof(T).Name;
        EntityKey key = new EntityKey(qualifiedEntitySetName, entityKeyValues);

        return (T)_context.GetObjectByKey(key);           
    }

try this

    public virtual T GetByID(object id)
    {

        // Define the entity key values.
        IEnumerable<KeyValuePair<string, object>> entityKeyValues =
            new KeyValuePair<string, object>[] { 
            new KeyValuePair<string, object>("Id", id) };

        string qualifiedEntitySetName = _context.DefaultContainerName + "." + typeof(T).Name;
        EntityKey key = new EntityKey(qualifiedEntitySetName, entityKeyValues);

        return (T)_context.GetObjectByKey(key);           
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文