EF DB 上下文在一般检索的实体上为空

EF DB Context Is Null On Generically Retrieved Entities

我正在四处寻找一种方法来统一某些数据库的数据访问层,这些数据库具有相同的字段明智但驻留在不同的 EF DB 上下文中。我想到了这样的东西(请忽略字符串插值,这只是一个原型):

public static T FetchEvent<T>(System.Data.Entity.DbContext dbContext, int eventId) where T : class, IEvent
{
    var record = dbContext.Database.SqlQuery<T>($"SELECT * FROM Events WHERE EventId = {eventId}").SingleOrDefault();
    return record;
}

每个数据库都有一个事件 table 并且相关的 EF 实体实现了 IEvent,其中 IEvent 只是字段及其数据类型以模仿 table 结构。使用通用 T 参数,调用代码在检索记录时指定正确的本地 EF 实体类型。

代码运行并 returns 记录,但是动态代理对象上的 EF 上下文为空,因此您无法对实体进行任何更新。

我的问题:当我以这种方式检索记录时,有没有办法让 EF 上下文持续存在?

由于所有事件都具有相同的字段,可以将其提取到接口并假设具体的 T 映射到相应的上下文,您可以使用 DbContext.Set<T> 方法:

public interface IEvent
{
    public int EventId {get; set;}
    // rest of the props 
}

public static T FetchEvent<T>(System.Data.Entity.DbContext dbContext, int eventId) where T : class, IEvent
{
    var record = dbContext
        .Set<T>()
        .Where(e => e.EventId == eventId)
        .SingleOrDefault();
    return record;
}