EF Core 5.0如何使用一个通用存储库管理多个实体类

人头马B.

这里的第一个问题,我希望我做对了。

我正在使用具有洋葱架构(data / repo / service / mvc)的Entity Framework Core 5.0(代码优先),因此我为每个表(几乎)都提供了服务。它工作正常,但是现在我需要管理(获取,插入,更新,删除)大约150个表,这些表都具有相同的结构(ID,名称,顺序)。

我在DbContext中也将它们分别添加为Entity类和DbSet,但是我不想提供150个服务,我想拥有一个通用的服务。

如何将其绑定到我的通用存储库?

public class Repository<T> : IRepository<T> where T : BaseEntity
{
    private readonly ApplicationContext context;
    private DbSet<T> entities;
    private readonly RepositorySequence repoSequence;
            
    private string typeName { get; set; }
            
    public Repository(ApplicationContext context)
    {
        this.context = context;
        entities = context.Set<T>();
        this.repoSequence = new RepositorySequence(context);
            
        this.typeName = typeof(T).Name;
    }
            
    public T Get(long plng_Id)
    {
        return entities.SingleOrDefault(s => s.Id == plng_Id);
    }
   [...]
}

在理想的世界中,想拥有这样的东西:

public async Task Insert(dynamic pdyn_Entity)
{
    Type DynamicType = Type.GetType(pdyn_Entity);
    Repository<DynamicType> vobj_Repo = new Repository<DynamicType>(mobj_AppContext);
    long Id = await vobj_Repo.InsertAsync(pdyn_Entity);
}

但是我也可以尝试从DbSet字符串Name中获取类型,我只是设法检索了一些数据:

public IEnumerable<object> GetAll(string pstr_DbSetName)
{
     return ((IEnumerable<BaseEntity>)typeof(ApplicationContext).GetProperty(pstr_DbSetName).GetValue(mobj_AppContext, null));
 }

我已经尝试了以下方法(显然与2.0兼容)来获得良好的DbSet,但都不起作用(没有查询):https ://stackoverflow.com/a/48042166/10359024

我想念什么?

非常感谢你的帮助

阿舍古鲁

不确定为什么需要输入文字?

您可以使用类似这样的东西。

仓库.cs

public class Repository<T> : IRepository<T> where T : BaseEntity
{
    private readonly ApplicationContext context;
    private DbSet<T> entities;

    public Repository(ApplicationContext context)
    {
        this.context = context;
        entities = context.Set<T>();
    }
    
    public List<T> Get()
       => entities.ToList();

    public T Get(long plng_Id)
       => entities.Find(plng_Id);
    
    public long Save(T obj)
    { 
        if (obj.ID > 0)
           entities.Update(obj);
        else
           entities.Add(obj);

        return obj.ID;
    }

    public void Delete(T obj)
       => entities.Remove(obj);
}

然后,您可以使用以下两个选项之一

  1. 表后有多个存储库

UserRepository.cs

public class UserRepository : Repository<User> : IUserRepository
{
    private readonly ApplicationContext context;
    public UserRepository(ApplicationContext context)
    {
        this.context = context;
    }
}

BaseService.cs

public class BaseService : IBaseService
{
    private readonly ApplicationContext context;
    private IUserRepository user;
    private IRoleRepository role;
    public IUserRepository User { get => user ??= new UserRepository(context); }
    public IRoleRepository Role { get => user ??= new RoleRepository(context); }

    public BaseService(ApplicationContext context)
    {
        this.context = context;
    }
}
  1. 如果您懒于创建多个存储库,也可以使用这种方式。您的服务只需简单地使用实体名称调用存储库。

BaseService.cs

public class BaseService : IBaseService
{
    private readonly ApplicationContext context;
    private IRepository<User> user;
    private IRepository<Role> role;
    public IRepository<User> User { get => user ??= new Repository<User>(context); }
    public IRepository<Role> Role { get => role ??= new Repository<Role>(context); }

    public BaseService(ApplicationContext context)
    {
        this.context = context;
    }
}

最后,您可以像这样致电服务。如果需要,可以使用多个服务而不是BaseService。

HomeController.cs

public class HomeController : Controller
{
   private readonly IBaseService service;
   public HomeController(IBaseService service)
   {
       this.service = service;
   }

   public IActionResult Index()
   {
       var user = service.User.Get();
       return View(user);
   }

   public IActionResult Add(User user)
   {
       var id = service.User.Save(user);
       return View();
   }
}

我建议使用第一个选项(多个存储库),因为将来可能需要在自己的存储库中自定义函数。然后根据您的控制器名称创建服务类。例如,您有HomeController,UserController等。创建HomeService,UserService并将它们与BaseService链接,以便可以在它们自己的服务类中创建自定义函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

更改生成的联接表的名称(多对多)-EF Core 5

来自分类Dev

如何使用EF Core更新ASP.NET 5中的dbcontext脚手架?

来自分类Dev

EF Core 3.1到5更新-> IEntityType.GetTableName

来自分类Dev

EF Core 3.0中的存储过程

来自分类Dev

EF Core:更新实体而不先查询

来自分类Dev

如何异步使用EF Core扩展方法

来自分类Dev

如何使用EF Core中的DbContext基类访问实体?

来自分类Dev

EF Core:无法跟踪实体类型的实例,因为另一个具有相同键值的实例

来自分类Dev

只读表/实体EF Core 3.0

来自分类Dev

如何使用EF Core Power Tools在同一项目中管理多个dbcontext?

来自分类Dev

更改生成的联接表的名称(多对多)-EF Core 5

来自分类Dev

EF Core 5将阴影备用键添加到某些实体,但不使用该属性

来自分类Dev

带总和的EF Core 5

来自分类Dev

EF Core 5,删除多对多关系

来自分类Dev

如何在EF Core 5中为自动生成的多对多表定义DbSet?

来自分类Dev

如何将主键移至EF Core 5中的基本表

来自分类Dev

在EF Core中添加或更新实体

来自分类Dev

EF Core连接结果的通用类型类

来自分类Dev

如何使用Ef Core异步查询数据?

来自分类Dev

EF Core 3.1到5更新-> IEntityType.GetTableName

来自分类Dev

EF Core 5如何停止将ValueGeneratedOnAdd添加到我的所有模型中

来自分类Dev

使用EF7(EF Core)的UWP数据绑定

来自分类Dev

无法使用 EF Core 迁移

来自分类Dev

EF Core 更新无法跟踪实体类型“广告”的实例

来自分类Dev

EF Core 访问嵌套嵌套实体

来自分类Dev

EF Core - 实体映射配置

来自分类Dev

保持数据库同步 ef core

来自分类Dev

多个请求而不是 EF Core 中的一个

来自分类Dev

两个不同的实体引用同一个实体 Ef Core

Related 相关文章

热门标签

归档