首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用EFCore 3.1从DbContext中选择特定的EFCore?

如何使用EFCore 3.1从DbContext中选择特定的EFCore?
EN

Stack Overflow用户
提问于 2020-12-11 01:03:07
回答 2查看 81关注 0票数 0

我的应用程序现在可以使用5个表,也许将来会有更多,我想尽量减少代码重复。下面是一个用于Swd0004的示例,我也有用于Swd0013的相同代码,以及每个表的其他重复函数。用户可以从下拉框中选择要使用的表。我想接受这个下拉框选择,并以某种方式将其传递给函数。

代码语言:javascript
复制
private void SWD_0004_Lookup()
{
    using (var ctx = new EFContext())
    {
        var query = ctx.Swd0004;
        var readList = query.ToList();
        Debug.WriteLine("QUERY COUNT: " + readList.Count);
        // create datatable from query results so I can populate datagridview
        var dt = LINQResultToDataTable(query);
        dgvQueryResults.DataSource = dt;
        GetColumnHeaders(dt);
        DataDT = dt; // copy local dt so we can use DataDT for getting record data
    }
}

这是一个数据库优先的应用程序。Swd0004是数据库中的一个表,因此是我的EFContext类中的一个DbSet。我的Swd0004类:

代码语言:javascript
复制
namespace SWDDB.Models
{
    public partial class Swd0004
    {
        public int Id { get; set; }
        public string PartNumber { get; set; }
...

那么我需要添加一个泛型来实现@abdusco答案吗?也许我对泛型还不够熟悉。

代码语言:javascript
复制
    public partial class Swd0004<TEntity> : ??? where TEntity : class

下面是另一个例子:

代码语言:javascript
复制
private List<Swd0004> ConvertDT(DataTable dt)
{
    var importList = new List<Swd0004>();
    // convert DataRow object to SWD object, otherwise BulkInsert will fail
    foreach (DataRow row in dt.Rows)
    {
        var obj = CreateItemFromRow<Swd0004>(row);
        // BulkInsert needs a list
        importList.Add(obj);
    }
    return importList;
}

如您所见,我必须显式地声明Swd0004三次。因此,我必须为每个表重复此函数5次。

UPDATE我正在尝试实现@bolkay建议的内容。我创建了这个类:

代码语言:javascript
复制
using SWDDB.Models;
using System.Diagnostics;
using System.Linq;

namespace SWDDB
{
    public abstract class BaseLookup<TEntity> where TEntity : class
    {
        public virtual void PerformLookup()
        {
            using (var ctx = new EFContext())
            {
                var query = ctx.Set<TEntity>();
                Debug.WriteLine("QUERY COUNT: " + query.ToList().Count);
            }
        }
    }
    public class SWD0004Lookup : BaseLookup<Swd0004>
    {
        
    }
}

感觉我已经很接近了,但是我不知道如何从我的主线代码调用PerformLookup。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-11 01:16:39

我不完全理解用户选择要使用的表背后的逻辑。

您可以这样做,以此为起点来删除重复的方法。

使用逻辑创建一个基类。

代码语言:javascript
复制
    public abstract class BaseLookUp<TEntity> where TEntity : class
    {
        public virtual void PerformLookup()
        {
            using (var ctx = new EFContext())
            {
                var query = ctx.Set<TEntity>();
                //etc...
            }
        }
    }
    public class SWD004Lookup : BaseLookUp<SWD004004>
    {

    }

完全根据你的需要,你可以把它变成一个静态的方法等等。

票数 1
EN

Stack Overflow用户

发布于 2020-12-11 01:13:20

You can get a DbSet using DbContext.Set(),而不是使用EfContext类中的属性:

代码语言:javascript
复制
private void SWD_Lookup<TEntity>() // <-- turn it into a generic method
{
    using (var ctx = new EFContext())
    {
        var query = ctx.Set<TEntity>(); // <-- get dbset by passing the type
        // ...
    }
}

然后你可以这样叫它:

代码语言:javascript
复制
SWD_Lookup<Swd0004>();
SWD_Lookup<Swd0013>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65238973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档