C# 为什么实体框架存储库模式不是';行不通

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

我在使用存储库模式获取Entity Framework(代码优先,已经存在的Oracle DB,没有使用edmx文件生成类,是手工完成的)时遇到了巨大的问题

例如:

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