C# 为什么实体框架存储库模式不是';行不通
我在使用存储库模式获取Entity Framework(代码优先,已经存在的Oracle DB,没有使用edmx文件生成类,是手工完成的)时遇到了巨大的问题 例如:C# 为什么实体框架存储库模式不是';行不通,c#,entity-framework,linq,C#,Entity Framework,Linq,我在使用存储库模式获取Entity Framework(代码优先,已经存在的Oracle DB,没有使用edmx文件生成类,是手工完成的)时遇到了巨大的问题 例如: public virtual T GetSingle(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties) { T item = null; using (va
public virtual T GetSingle(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties) {
T item = null;
using (var context = new CaptureEntitiesDbContext()) {
IQueryable<T> dbQuery = context.Set<T>();
//Apply eagerLoading for some reason
foreach (Expression<Func<T, object>> navigationProperty in navigationProperties) {
dbQuery = dbQuery.Include<T, object>(navigationProperty);
}
item = dbQuery
.AsNoTracking()
.FirstOrDefault(where);
}
return item;
}
上面是我向应用的IQueryable对象发送的实体框架查询。对于这个特定的查询,我不想急于加载任何内容,因此我不发送任何导航属性(这些属性将应用于dbQuery.Include(navigationProperty)foreach语句)。我正在尝试检索的实体:
[Table("WACKKY_USER", Schema = "UL_DOC_WACKKY")]
public class WACKKYUser :BaseDTO
{
[Key]
[Column("WORKER_PARTY_ID")]
public long workerPartyID { get; set; }
[Column("FIRST_NM")]
public string firstName { get; set; }
[Column("LAST_NM")]
public string lastName { get; set; }
[Column("WACKKY_USER_STATUS_DC")]
public string statusDescription { get; set; }
[Column("RECORD_CREATE_GMTS")]
public System.DateTime recordCreateGmTs {get;set;}
[Column("USER_ID_EXPIRE_TS")]
public System.DateTime userIdExpireTs { get; set; }
[Column("RECORD_CREATE_USER_ID")]
public string recordCreateUserID { get; set; }
[Column("ESORT_DOC_VERIF_PCT")]
public int esortDocVerifPct { get; set; }
[Column("LOCATION_NM")]
public string locationName { get; set; }
[Column("COMPANY_NM")]
public string companyNm { get; set; }
public override System.Collections.Hashtable getDataMap() {
Hashtable table = base.getDataMap();
table.Add("workerPartyID", workerPartyID);
table.Add("firstName", firstName);
table.Add("lastName", lastName);
table.Add("statusDescription", statusDescription);
table.Add("recordCreateGmTs", recordCreateGmTs);
table.Add("userIdExpireTs", userIdExpireTs);
table.Add("recordCreateUserID", recordCreateUserID);
table.Add("esortDocVerifPct", esortDocVerifPct);
table.Add("companyNm", companyNm);
table.Add("locationNm", locationName);
return table;
}
[ForeignKey("userId")]
public virtual System.Collections.Generic.ICollection<UserRoleRltn> userRoles { get; set; }
}
[表格(“古怪的用户”,Schema=“UL\u DOC\u古怪”)]
公共类古怪用户:BaseDTO
{
[关键]
[列(“工人方ID”)]
公共长workerPartyID{get;set;}
[列(“第一列”)]
公共字符串名{get;set;}
[列(“最后一列”)]
公共字符串lastName{get;set;}
[栏目(“古怪用户状态DC”)]
公共字符串statusDescription{get;set;}
[列(“记录创建GMT”)]
public System.DateTime recordCreateGmTs{get;set;}
[列(“用户ID到期”)]
public System.DateTime userIdExpireTs{get;set;}
[列(“记录\创建\用户\ ID”)]
公共字符串recordCreateUserID{get;set;}
[列(“ESORT文档验证PCT”)]
公共int esortDocVerifPct{get;set;}
[列(“位置”)]
公共字符串位置名称{get;set;}
[列(“公司”)]
公共字符串companyNm{get;set;}
public override System.Collections.Hashtable getDataMap(){
Hashtable table=base.getDataMap();
表.添加(“workerPartyID”,workerPartyID);
表.添加(“名字”,名字);
表.添加(“lastName”,lastName);
表.添加(“状态描述”,状态描述);
表.添加(“recordCreateGmTs”,recordCreateGmTs);
表.添加(“userIdExpireTs”,userIdExpireTs);
table.Add(“recordCreateUserID”,recordCreateUserID);
表.添加(“esortDocVerifPct”,esortDocVerifPct);
表.添加(“公司名称”,公司名称);
表.添加(“位置NM”,位置名称);
返回表;
}
[外键(“用户ID”)]
公共虚拟系统.Collections.Generic.ICollection用户角色{get;set;}
}
扩展DbContext的我的对象
public class CaptureEntitiesDbContext : DbContext
{
public CaptureEntitiesDbContext() {
GetInstance();
}
public CaptureEntitiesDbContext(string connectionString) : base(connectionString) {
Database.SetInitializer<CaptureEntitiesDbContext>(null);
}
public static CaptureEntitiesDbContext GetInstance() {
CaptureDBDAO.DBConnectionFactory connfact = new CaptureDBDAO.DBConnectionFactory();
string connectionStr = connfact.GetConnection().ConnectionString;
CaptureEntitiesDbContext ctx = new CaptureEntitiesDbContext(connectionStr);
//ctx.Database.Log = Console.Write; <-- Not sure what this is doing???
return ctx;
}
...
public DbSet<CaptureUser> CaptureUsers { get; set; }
...
}
公共类CaptureEntitiesDbContext:DbContext
{
public CaptureEntitysDBContext(){
GetInstance();
}
public CaptureEntitiesDbContext(字符串connectionString):基(connectionString){
Database.SetInitializer(null);
}
公共静态CaptureEntitysDBContext GetInstance(){
CaptureDBDAO.DBConnectionFactory connfact=新的CaptureDBDAO.DBConnectionFactory();
字符串connectionStr=connfact.GetConnection().ConnectionString;
CaptureEntitysDBContext ctx=新CaptureEntitysDBContext(connectionStr);
//ctx.Database.Log=Console.Write;我能推荐一种更好的存储库模式吗?分享“奇怪的异常”而不是让所有人猜测会很有帮助。你没有分享任何细节,但我注意到的一点是,你应该在“where”中使用“Expression”而不是“Func”GetSingle中的参数。@Valkyrie你可以。你有没有想到一个或链接到一个关于这种更好模式的教程?这一个似乎很有效。如果我能让它工作,它会很好。@Jasen,请查看我链接到的帖子,了解奇怪的例外情况谢谢。
public class CaptureEntitiesDbContext : DbContext
{
public CaptureEntitiesDbContext() {
GetInstance();
}
public CaptureEntitiesDbContext(string connectionString) : base(connectionString) {
Database.SetInitializer<CaptureEntitiesDbContext>(null);
}
public static CaptureEntitiesDbContext GetInstance() {
CaptureDBDAO.DBConnectionFactory connfact = new CaptureDBDAO.DBConnectionFactory();
string connectionStr = connfact.GetConnection().ConnectionString;
CaptureEntitiesDbContext ctx = new CaptureEntitiesDbContext(connectionStr);
//ctx.Database.Log = Console.Write; <-- Not sure what this is doing???
return ctx;
}
...
public DbSet<CaptureUser> CaptureUsers { get; set; }
...
}