[英]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.