如何创建可以使用任何 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;
}
我正在尝试创建一个 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;
}