如何创建可以使用任何 Ef Core DbContext 的 class 库

How to create a class library that can use any Ef Core DbContext

我正在尝试创建一个 class 库,它可以使用 DbContext,它将能够查询具有通用模式的实体。 (这是一个数据库第一个项目)

我的 class 库项目中有以下内容:

    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; }
    {

我想做的是使下面的合同成为现实,但是,我不确定如何处理这个合同。我希望能够 return 一条与 GetBestTranslation 方法中的常见查询相匹配的记录,我希望 return 一个 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 与现有数据集 table Type 匹配来在您的上下文中请求数据集。不要忘记添加 where : T : class 这将告诉函数通用 Type T 由您在调用中提供的 class 分配。

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);

您可以在方法上使用 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;
}