我正在编写通过ID获取单个实体的方法:
public Customer GetCustomer(int i_CustomerID)
{
return (from c in context.CustomerSet
where c.Id == i_CustomerID
select c).SingleOrDefault();
}
public Movie GetMovie(int i_MovieID)
{
return (from m in context.MovieSet
where m.Id == i_MovieID
select m).SingleOrDefault();
}
但是我有很多实体,并且这段代码会重复执行。我想写一个这样的方法:
public T GetEntityByID<T>(int i_EntityID)
{
return (from e in context.T_Set
where e.Id == i_EntityID
select e).SingleOrDefault();
}
有没有办法做到这一点?
发布于 2011-03-27 09:26:28
我实际上并没有执行这个代码,但是它会编译,并且很可能是您想要实现的东西:
public static void Testing()
{
SelectEntity<MyObject>(r => r.MyObjectId == 1);
}
public static T SelectEntity<T>(Expression<Func<T, bool>> expression) where T : EntityObject
{
MyContext db = new MyContext();
return db.CreateObjectSet<T>().SingleOrDefault(expression);
}
发布于 2011-03-27 09:26:07
问题是,没有通用的超类型具有您所寻求的相关属性。然而,使用EF正在使用的内置T4代码生成工具来生成fetch方法是很容易的。这里有一个很好的链接,告诉你如何钩住并生成你所需要的代码。
发布于 2011-03-27 11:45:54
如果您知道您的泛型存储库将始终与具有相同名称和相同类型的PK的实体类型一起使用,那么您可以简单地定义如下接口:
public interface IEntity
{
int Id { get; }
}
或者在部分生成的实体中实现此接口,或者修改T4模板以自动包含它。然后,您的存储库将定义为:
public interface IRepository<TEntity> where T : IEntity
{
...
}
如果主键类型可以改变,但名称仍然不变,则可以将实体接口改进为:
public interface IEntity<TKey>
{
TKey Id { get; set; }
}
存储库的定义为:
public interface IRepository<TEntity, TKey> where TEntity : IEntity<TKey>
{
...
}
如果你想要通用存储库,它能够处理具有不同PK名称和类型的实体,请检查this answer。该解决方案可能也适用于复合PKs (或稍加修改)。
https://stackoverflow.com/questions/5448250
复制相似问题