我使用EF6在当前的web api项目中实现了存储库模式。目前,我有以下函数(在CustomerRepository中)返回客户:
public override Customer Get(int id, params Expression<Func<Customer , object>>[] include)
{
if (include.Any())
{
var set = include.Aggregate<Expression<Func<Customer , object>>, IQueryable<Customer >>
(dbset, (current, expression) => current.Include(expression));
return dbset.SingleOrDefault(x => x.Id == id)
}
return dbset.Find(id);
}
这很好用,但我想在我的通用存储库中移动上面的方法。这里的问题是SingleOrDefault,因为Id不会为T所知。
有没有办法解决这个问题?我需要实现一个接口吗?
另一方面,我所有实体的第一个属性是&#39; int Id&#39;。
答案 0 :(得分:1)
嗯,你确定吗:这很好用,
return dbset.SingleOrDefault(x => x.Id = id)
不应该是:
return dbset.SingleOrDefault(x => x.Id == id)
无论如何,如果你的所有实体都有一个整数Id属性,为什么不让它们都实现一个接口:
public interface IEntity
{
int Id { get; }
}
然后你将通用T参数约束到基础仓库中的这个接口,你将知道如何编写lambda。
答案 1 :(得分:1)
EF6有Find()
方法,可以满足您的需要。
http://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx
public T Get(int id)
{
return dbset.Find(id);
}
不要担心它会加载比所需更多的连接表(包括)。对于单一唱片来说,这并不是什么大不了的事。编辑:对不起,Find
实际上没有任何自己的热切加载。仅当相关实体已被上下文跟踪时才会返回相关实体。