2012-09-27 59 views
0

如何將擴展方法添加到DbContext之外?帶擴展方法的stackoverflow異常

這將引發堆棧溢出異常:

public IQueryable<T> All<T>() where T : class, new() 
    { 
     return this.All<T>(); 
    } 

我打電話此使用的代碼:

var u = UnitOfWork.All<User>().ToList(); 

工作的單位是:

protected DBContext UnitOfWork = new DBContext(); 

這也拋出:

return this.All<T>().AsQueryable(); 

我的班級:

public class DBContext : DbContext, ISession 
{ 

    public DBContext() 
     : this("name=myConnString") 
    { 

    } 

    public SurventrixContext(string dbcontext) 
     : base(dbcontext) 
    { 

    } 

    #region mappings 

    private void UserMappings(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable("tUsers"); 

     modelBuilder.Entity<User>().Property(x => x.UserID).HasColumnName("fU_UserID") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     modelBuilder.Entity<User>().Property(x => x.FirstName).HasColumnName("fU_First_Name"); 
     modelBuilder.Entity<User>().Property(x => x.LastName).HasColumnName("fU_Last_Name"); 
     modelBuilder.Entity<User>().Property(x => x.Login).HasColumnName("fU_Login"); 
     modelBuilder.Entity<User>().Property(x => x.Password).HasColumnName("fU_Password"); 
     modelBuilder.Entity<User>().Property(x => x.Email).HasColumnName("fU_Email"); 
     modelBuilder.Entity<User>().Property(x => x.Tel).HasColumnName("fU_Tel"); 
     modelBuilder.Entity<User>().Property(x => x.CreateDate).HasColumnName("fU_CreateDate"); 
     modelBuilder.Entity<User>().Property(x => x.LastPasswordChangedDate).HasColumnName("fU_LastPasswordChangedDate"); 
     modelBuilder.Entity<User>().Property(x => x.PasswordKey).HasColumnName("fU_PasswordKey"); 
     modelBuilder.Entity<User>().Property(x => x.KeyExpiryDate).HasColumnName("fU_KeyExpiryDate"); 
     modelBuilder.Entity<User>().Property(x => x.ApiToken).HasColumnName("fU_ApiToken"); 

     modelBuilder.Entity<User>().HasKey(t => t.UserID) 
      .Property(x => x.UserID); 
    } 

    #endregion 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     UserMappings(modelBuilder); 

     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<User> User { get; set; } 

    public DbSet<ReportCommit> ReportCommit { get; set; } 

    public DbSet<Organization> Organization { get; set; } 

    public void CommitChanges() 
    { 
     this.SaveChanges(); 
    } 

    public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() 
    { 
     this.Delete<T>(expression); 
    } 

    public void Delete<T>(T item) where T : class, new() 
    { 
     this.Delete<T>(item); 
    } 

    public void DeleteAll<T>() where T : class, new() 
    { 
     this.DeleteAll<T>(); 
    } 

    public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() 
    { 
     return this.Single<T>(expression); 
    } 

    public IQueryable<T> All<T>() where T : class, new() 
    { 
     return this.All<T>().AsQueryable(); 
    } 

    public void Add<T>(T item) where T : class, new() 
    { 
     this.Add<T>(item); 
    } 

    public void Add<T>(IEnumerable<T> items) where T : class, new() 
    { 
     foreach (var item in items) 
     { 
      this.Add<T>(item); 
     } 
    } 

    public void Update<T>(T item) where T : class, new() 
    { 
     this.Update<T>(item); 
    } 
} 

回答

2

這不是一個擴展方法!你剛剛創建了一個在遞歸中調用自己的方法。

擴展方法是這樣的:

public static IQueryable<T> All<T>(this IQuearyable<T> query) where T : class, new() 
{ 
    return query.All(); 
} 

編輯:

我檢查你的代碼,你是最有可能不是在尋找擴展方法都沒有。您正在尋找:

public IQuerybale<T> All<T>() where T : class, new() 
{ 
    return this.Set<T>(); 
} 
+0

我的壞 - 我該如何實現接口方法''''System.Linq.IQueryable 所有()其中T:類,新的();''''? – Haroon

+0

我添加了附加示例。 –

+0

哈哈...在你發貼之前我挖得更深一點,發現'''設置爲''''現在就測試一下,謝謝:) – Haroon