簡體   English   中英

如何創建可以使用任何 Ef Core DbContext 的類庫

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM