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



我一直在摸索一种方法,为一些数据库统一数据访问层,这些数据库的类型在字段上相同,但位于不同的EF DB上下文中。我想出了这样的东西(plz忽略字符串插值,这只是一个原型(:

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;
}

每个数据库都有一个Events表,相关的EF实体实现IEvent,其中IEvent只是模拟表结构的字段及其数据类型。对于通用T参数,在检索记录时,由调用代码指定正确的本地EF实体类型。

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

我的问题是:当我以这种方式检索记录时,有没有一种方法可以让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;
}

最新更新