【发布时间】:2018-02-19 16:53:18
【问题描述】:
我想创建一个辅助方法来检查数据库中是否存在项目。
我试过了:
public static class DbContextExtensions
{
public static bool Exist<TModel>(this DbSet<TModel> model, string id) where TModel : class
{
return !string.IsNullOrEmpty(id) && model.SingleOrDefault(x => x.Id == id) != null;
}
}
我收到此错误消息:
“TModel”不包含“Id”的定义,并且找不到接受“TModel”类型的第一个参数的扩展方法“Id”(您是否缺少 using 指令或程序集引用?)
我想要达到的目标:
public class PostManager
{
private readonly _dbContext;
public PostManager(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<IdentityResult> UpdateAsync(EditPostViewModel model)
{
if (_dbContext.Users.Exist(model?.UserId) && _dbContext.Posts.Exist(model?.Id))
{
// the user with "UserId" and the post with "Id" are existing...
}
}
}
我不想在 PostManager 类中创建辅助方法,如下所示:
public class PostManager
{
// contructor...
// actions...
private bool UserExist(string id)
{
return !string.IsNullOrEmpty(id) && _dbContext.Users.SingleOrDefault(x => x.Id == id) != null;
}
private bool PostExist(string id)
{
return !string.IsNullOrEmpty(id) && _dbContext.Posts.SingleOrDefault(x => x.Id == id) != null;
}
}
因为UserExist 和PostExist 方法可以在许多其他类中使用。所以,我不想在使用之前在每个类中重新声明它们。
我该怎么做?非常感谢!
【问题讨论】:
-
您的
where TModel : class- 这告诉编译器 TModel 的类型为class,这太通用了,它不包含id作为属性。所以你需要将它指向一个基实体类,如果你有的话,比如where TModel:Entity -
无关说明:使用
model.Any(x => x.Id == i)而不是model.SingleOrDefault(x => x.Id == i) != null来检查是否存在。 -
@Evk 好点。谢谢!
标签: c# entity-framework