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;
}
我正在四处寻找一种方法来统一某些数据库的数据访问层,这些数据库具有相同的字段明智但驻留在不同的 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;
}