如何抽象数据库访问逻辑,通过泛型复用多模型CRUD操作
解决方案
1. 先定义公共实体接口
所有需要用到泛型CRUD的模型都实现这个接口,统一id属性的定义:
public interface IEntity { int id { get; set; } }
2. 修改模型类实现接口
(你原示例里User的name属性类型写为int属于笔误,这里修正为string)
class User : IEntity { public int id { get; set; } public string name { get; set; } public int age { get; set; } } class Seller : User { public List<string> products { get; set; } }
3. 给泛型方法添加对应约束
两个报错都是缺少泛型约束导致的:
- 报错1是因为SQLite的
Table<T>要求T必须为非抽象类、包含公共无参构造,对应加class, new()约束即可 - 报错2是因为编译器不知道泛型T包含id属性,通过接口约束
IEntity明确属性存在
修改后的泛型方法如下:
// 查全表通用方法 public static async Task<List<T>> GetAll<T>() where T : class, new() { await Init(); return await db.Table<T>().ToListAsync(); } // 按id查询通用方法(你原代码里的isCustomer参数未使用,可直接删除) public static async Task<T> GetById<T>(int id) where T : class, IEntity, new() { await Init(); return await db.Table<T>().Where(x => x.id == id).FirstAsync(); }
调用示例
// 查所有User var allUsers = await GetAll<User>(); // 查id为5的Seller var targetSeller = await GetById<Seller>(5);
补充注意:Seller类中的
List<string> products属性SQLite无法直接存储,需要额外配置序列化映射为文本类型存储,或者单独拆分为关联表。
内容的提问来源于stack exchange,提问作者Nicoara
相关产品推荐
相关产品推荐

