繁体   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