Jea*_*ois 2 entity-framework-4
有些正文可以帮助我创建一个通用的GetByID方法,这里的挑战是,我有很多实体,每个实体都有不同的PK名称.
我看到几个带有Generic GetByID的例子,但是其中很多都有像(id)一样的PK Name.
谢谢.
以下是使用单个属性键为实体构建存储库的基本存储库类的示例.该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
}
}
Run Code Online (Sandbox Code Playgroud)
使用此代码时有一个漏洞.如果您不使用派生自生成的类ObjectContext并ObjectContext直接使用,则必须手动设置DefaultContainerName模型使用的类.
编辑:
此方法适用于经典EF.如果需要,我可以考虑Code-first的版本.
| 归档时间: |
|
| 查看次数: |
4308 次 |
| 最近记录: |