以下两种方法是通用存储库模式实现的一部分。
GetById工作并返回Id == id。
的行GetByIdIncludingEntities有问题。它需要与GetById类似地工作,其附加功能包括(加载)“entities”数组中指定的相关实体行。目前它可以工作,但它返回多行结果中的第一行。它只需要返回具有Id == id的行。请注意,所有实体都有一个名为“Id”的主键,它们是一个整数(请参阅下面的实体模型)。
public virtual TEntity GetByIdIncludingEntities(int id, string[] entities)
{
// id: The primary key value to find.
// entities: Array of related entities to eagerly load. i.e., “BigThings”
var query = from q in context.Set<TEntity>() select q;
foreach (string entity in entities)
{
query = query.Include(entity);
}
return query.SingleOrDefault();
}
public virtual TEntity GetById(int id)
{
return context.Set<TEntity>().Find(id);
}
Here is a sample entity for reference.
[Table("Things")]
public class Thing
{
public Thing()
{
this.BigThings = new HashSet<BigThing>();
this.SmallThings = new HashSet<SmallThing>();
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
[IgnoreDataMember]
public virtual ICollection<BigThing> BigThings { get; set; }
[IgnoreDataMember]
public virtual ICollection<SmallThing> SmallThings { get; set; }
}
答案 0 :(得分:0)
如果您想按ID查找...请不要使用
return query.SingleOrDefault();
(顺便说一句,这可能会引发异常)
使用
return query.Find(id);
顺便说一下,为了避免字符串,你可以使用
public virtual TEntity GetByIdIncludingEntities(int id, params Expression<Func<TEntity, object>> [] entities)
{
var query = context.Set<TEntity>();
foreach (var entity in entities)
query = query.Include(entity);
return query.Find(id;
}
因为Include有一个重载,它以Expression<Func<TEntity, TValue>>
作为参数(你可能需要导入正确的命名空间才能得到它)。
然后使用
repository.GetByIdIncludingEntities<Entity1>(id, m => m.RelatedEntity, m=> m.OtherRelatedEntity)