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