[英]How to create a class library that can use any Ef Core DbContext
我正在尝试创建一个可以使用 DbContext 的类库,该 DbContext 将能够查询具有通用模式的实体。 (这是数据库第一个项目)
我的类库项目中有以下内容:
public interface ITranslate
{
public long Id
public long ParentId
public long LangId
}
在一个单独的项目中,我将拥有以下内容:
public partial class SectionTranslation : ITranslate
{
public string SectionName { get; set; }
{
在另一个项目中,我可能有以下
public partial class TemplateTranslation : ITranslate
{
public string TemplateName { get; set; }
{
我想做的是使以下合同成为现实,但是,我不确定如何处理这个合同。 我希望能够返回与 GetBestTranslation 方法中的常见查询匹配的记录,我希望返回 SectionTranslation 或 TemplateTranslation 实体,具体取决于哪个项目正在使用该库,并在 SaveTranslation 方法中保存翻译记录。
public interface ITranslateManager
{
Task<T> GetBestTranslationAsync(long langId);
Task CreateTranslationAsync<T>(long langId)
}
预先感谢大家的帮助
您可以通过执行以下操作简单地访问您的 dbContext:
protected readonly PostgisDbContext Context;
protected Service(PostgisDbContext context) : base(context)
{
Context = context;
}
使用这个上下文非常容易。 您可以通过将传入通用函数的Type
与现有的 Dataset 表Type
相匹配,在您的上下文中请求一个 Dataset。 不要忘记添加where : T : class
这将告诉函数通用Type
T
是由您在调用中提供的类分配的。
public Task<T> GetAsync(long langId) where : T : class
{
Context.Set<T>().Where(predicate).FirstOrDefault();
}
如果您需要代码更加动态,可以添加谓词作为其参数。 这将允许您使用查询不同的查询,而无需创建新函数。 例如x => x == true
。
public Task<T> Get(Func<T, bool> predicate) => Context.Set<T>().Where(predicate).FirstOrDefault();
要调用该方法,您必须告诉函数泛型Type
是什么。 你这样做:
_translationService.GetAsync<MyClass>(parameter);
您可以在 Method 上使用 where 条件。
public class TranslateManager : ITranslateManager
{
private readonly ContextDb _contextDb;
public TranslateManager(ContextDb contextDb)
{
_contextDb = contextDb;
}
public async Task CreateTranslationAsync<T>(long langId) where T : class, ITranslate
{
// ToDo
}
public async Task<ITranslate> GetBestTranslationAsync<T>(long langId) where T : class, ITranslate
{
var dbSet = _contextDb.GetDbSet<T>();
return await dbSet.Where(x => x.LangId == langId).FirstOrDefaultAsync();
}
}
public interface ITranslate
{
public long Id { get; set; }
public long ParentId { get; set; }
public long LangId { get; set; }
}
public partial class SectionTranslation : ITranslate
{
public long Id { get; set; }
public long ParentId { get; set; }
public long LangId { get; set; }
public string SectionName { get; set; }
}
public partial class TemplateTranslation : ITranslate
{
public long Id { get; set; }
public long ParentId { get; set; }
public long LangId { get; set; }
public string TemplateName { get; set; }
}
public interface ITranslateManager
{
Task<T> GetBestTranslationAsync<T>(long langId) where T : class, ITranslate;
Task CreateTranslationAsync<T>(long langId) where T : class, ITranslate;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.