Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建一个可以访问多个不同上下文数据库表的通用方法_C#_Asp.net Core_Entity Framework Core_Asp.net Core 3.1 - Fatal编程技术网

C# 创建一个可以访问多个不同上下文数据库表的通用方法

C# 创建一个可以访问多个不同上下文数据库表的通用方法,c#,asp.net-core,entity-framework-core,asp.net-core-3.1,C#,Asp.net Core,Entity Framework Core,Asp.net Core 3.1,我有很多方法,它们的名称如下: GetMonsterName GetTreasureName GetSpiritName GetCharacterName 他们都做了几乎相同的事情…就像这个例子: public async Task<string> GetMonsterName(long id) { var type = await _context.MonsterType.FindAsync(id); return type.Name; } 公共异步任务名称(长

我有很多方法,它们的名称如下:

GetMonsterName
GetTreasureName
GetSpiritName
GetCharacterName
他们都做了几乎相同的事情…就像这个例子:

public async Task<string> GetMonsterName(long id)
{
    var type = await _context.MonsterType.FindAsync(id);
    return type.Name;
}
公共异步任务名称(长id)
{
var type=wait_context.MonsterType.FindAsync(id);
返回类型.名称;
}
我知道您可以对泛型返回类型使用
,但是是否有一种方法也可以为我需要访问的数据库表传递泛型类型

这样我就可以像这样使用它

var type = await _context.<WhateverDatabaseTable>.FindAsync(id);
var type=await\u context..FindAsync(id);
这样我就不必每次都要从数据库中获取新的方法了


谢谢

我自己通常使用一个通用数据访问类(类似于存储库)来消除重复代码,这里的一个主要EF函数是Set方法,它按实体提供表通用参数:

一个简单的例子是:

public async Task<T> GetAsync<T>(long id) where T : class
{
    var item = await context.Set<T>().FindAsync(id);
    return item;
}
更改基类:

public class Device : Entity
并将通用函数更改为:

public async Task<string> GetAsync<T>(long id) where T : Entity
{
    var item = await context.Set<T>().FindAsync(id);
    return item.Name;
}
公共异步任务GetAsync(长id),其中T:Entity { var item=await context.Set().FindAsync(id); 返回项目名称; } 最后得到名字:

string deviceName = await GetNameAsync<Device>(1);
string deviceName=wait GetNameAsync(1);

谢谢,但您将如何使用此功能?比如,如果我想将它用于一个名为MonsterType的数据库表?谢谢,但我需要从任何对象获取“Name”属性……比如“item.Name”
public async Task<string> GetAsync<T>(long id) where T : Entity
{
    var item = await context.Set<T>().FindAsync(id);
    return item.Name;
}
string deviceName = await GetNameAsync<Device>(1);