如何在DbContext类中编写扩展方法?

时间:2018-02-19 05:59:33

标签: c# entity-framework

我想创建一个辅助方法来检查数据库中是否存在项目。

我试过这个:

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'的定义,并且没有扩展方法'Id'可以找到接受类型'TModel'的第一个参数(你是否缺少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;
    }
}

因为方法UserExistPostExist可能会在许多其他类中使用。所以,在使用之前,我不想在每个班级中重新声明它们。

我该怎么做?非常感谢你!

1 个答案:

答案 0 :(得分:2)

你有TModel : class - 因为TModel类型为class,它没有任何名为Id的属性,因此出错。所以你需要将它指向一个基本实体类(最好是一个接口 - 组合总是比继承更好),但这是为了给你一个大概的想法 - 比如TModel:Entity

e.g。

 class BaseEntity {
   string Id {get; set;}
 }

 class Person : BaseEntity {
   string Name {get; set;}
 } 

 public static class DbContextExtensions
 {
    public static bool Exist<TModel>(this DbSet<TModel> model, string id) where TModel : BaseEntity
   {
      return !string.IsNullOrEmpty(id) && model.SingleOrDefault(x => x.Id == id) != null;
   }
 }