Entity Framework Простой Общий GetByID, но имеет разные PK Имя - PullRequest
2 голосов
/ 11 марта 2011

Некоторое тело может помочь мне создать общий метод GetByID. Проблема здесь в том, что у меня много сущностей, каждая из которых имеет свое имя PK.

Я вижу несколько примеров с универсальным GetByID,но многие из них имеют одно и то же имя ПК, как (id).

Спасибо.

Ответы [ 2 ]

6 голосов
/ 12 марта 2011

Вот пример базового класса хранилища для сборки хранилища для сущности с одним ключом свойства.Метод 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, если это необходимо.

0 голосов
/ 03 августа 2015

Я знаю, что этот ответ старый и специально помечен как EF-4, но Find () или FindAsync () - это правильное решение для EF-6:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...