实体框架简单通用GetByID但具有不同的PK名称

时间:2011-03-11 13:22:45

标签: entity-framework-4

有些正文可以帮我创建一个通用的GetByID方法, 这里的挑战是,我有许多实体,每个实体都有不同的PK名称。

我看到几个带有通用GetByID的示例,但其中许多具有相同的PK名称,如(id)。

感谢。

2 个答案:

答案 0 :(得分:6)

以下是使用单个属性键为实体构建存储库的基本存储库类的示例。 GetByKey方法与密钥名称或类型无关。

using System;
using System.Data;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Linq;

namespace EntityKeyTest
{
    // Base repository class for entity with simple key
    public abstract class RepositoryBase<TEntity, TKey> where TEntity : class
    {
        private readonly string _entitySetName;
        private readonly string _keyName;

        protected ObjectContext Context { get; private set; }
        protected ObjectSet<TEntity> ObjectSet { get; private set; }

        protected RepositoryBase(ObjectContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            Context = context;
            ObjectSet = context.CreateObjectSet<TEntity>();

            // Get entity set for current entity type
            var entitySet = ObjectSet.EntitySet;
            // Build full name of entity set for current entity type
            _entitySetName = context.DefaultContainerName + "." + entitySet.Name;
            // Get name of the entity's key property
            _keyName = entitySet.ElementType.KeyMembers.Single().Name;
        }

        public virtual TEntity GetByKey(TKey key)
        {
            // Build entity key
            var entityKey = new EntityKey(_entitySetName, _keyName, key);
            // Query first current state manager and if entity is not found query database!!!
            return (TEntity)Context.GetObjectByKey(entityKey);
        }

        // Rest of repository implementation
    }
}

使用此代码时有一个漏洞。如果您不使用从ObjectContext派生的生成类并且直接使用ObjectContext,则必须手动设置模型使用的DefaultContainerName

修改

此方法适用于经典EF。如果需要,我可以考虑Code-first的版本。

答案 1 :(得分:0)

我知道这个答案很老,特别标记为EF-4,但Find()或FindAsync()是EF-6 fwiw的正确解决方案:

https://msdn.microsoft.com/en-us/library/dn246936(v=vs.113).aspx