2010-11-10 57 views
0

我有一個ASP.NET MVC項目,其中模型通過.NET實體進行管理,似乎有時會失去連接,但這隻發生在存儲過程上。存儲過程失去連接

我得到以下錯誤:

Execution of the command requires an open and available connection. The connection's current state is broken. 

這究竟是爲什麼?

代碼

public ObjectResult<Categories> GetCategoriesStructure() { 
     return ObjectContext.getCategoriesStructure(); 
    } 


var catss = GetCategoriesStructure().ToList(); 

當我試圖分配清單catss出現此異常變量

對象上下文實例化

public abstract class ObjectContextManager { 
    /// <summary> 
    /// Returns a reference to an ObjectContext instance. 
    /// </summary> 
    public abstract TObjectContext GetObjectContext<TObjectContext>() 
     where TObjectContext : ObjectContext, new(); 
} 

public abstract class BaseDAO<TObjectContext, TEntity> : IBaseDAO<TObjectContext, TEntity> 
    where TObjectContext : System.Data.Objects.ObjectContext, new() 
    where TEntity : System.Data.Objects.DataClasses.EntityObject { 

    private ObjectContextManager _objectContextManager; 

    /// <summary> 
    /// Returns the current ObjectContextManager instance. Encapsulated the 
    /// _objectContextManager field to show it as an association on the class diagram. 
    /// </summary> 
    private ObjectContextManager ObjectContextManager { 
     get { return _objectContextManager; } 
     set { _objectContextManager = value; } 
    } 

    /// <summary> 
    /// Returns an ObjectContext object. 
    /// </summary> 
    protected internal TObjectContext ObjectContext { 
     get { 
      if (ObjectContextManager == null) 
       this.InstantiateObjectContextManager(); 

      return ObjectContextManager.GetObjectContext<TObjectContext>(); 
     } 
    } 

    /// <summary> 
    /// Default constructor. 
    /// </summary> 
    public BaseDAO() { } 

    /// <summary> 
    /// Instantiates a new ObjectContextManager based on application configuration settings. 
    /// </summary> 
    private void InstantiateObjectContextManager() { 
     /* Retrieve ObjectContextManager configuration settings: */ 
     Hashtable ocManagerConfiguration = ConfigurationManager.GetSection("ObjectContextManagement.ObjectContext") as Hashtable; 
     if (ocManagerConfiguration != null && ocManagerConfiguration.ContainsKey("managerType")) { 
      string managerTypeName = ocManagerConfiguration["managerType"] as string; 
      if (string.IsNullOrEmpty(managerTypeName)) 
       throw new ConfigurationErrorsException("The managerType attribute is empty."); 
      else 
       managerTypeName = managerTypeName.Trim().ToLower(); 

      try { 
       /* Try to create a type based on it's name: */ 
       Assembly frameworkAssembly = Assembly.GetAssembly(typeof(ObjectContextManager)); 
       Type managerType = frameworkAssembly.GetType(managerTypeName, true, true); 

       /* Try to create a new instance of the specified ObjectContextManager type: */ 
       this.ObjectContextManager = Activator.CreateInstance(managerType) as ObjectContextManager; 
      } catch (Exception e) { 
       throw new ConfigurationErrorsException("The managerType specified in the configuration is not valid.", e); 
      } 
     } else 
      throw new ConfigurationErrorsException("ObjectContext tag or its managerType attribute is missing in the configuration."); 
    } 

    /// <summary> 
    /// Persists all changes to the underlying datastore. 
    /// </summary> 
    public void SaveAllObjectChanges() { 
     this.ObjectContext.SaveChanges(); 
    } 

    /// <summary> 
    /// Adds a new entity object to the context. 
    /// </summary> 
    /// <param name="newObject">A new object.</param> 
    public virtual void Add(TEntity newObject) { 
     this.ObjectContext.AddObject(newObject.GetType().Name, newObject); 
    } 
    /// <summary> 
    /// Deletes an entity object. 
    /// </summary> 
    /// <param name="obsoleteObject">An obsolete object.</param> 
    public virtual void Delete(TEntity obsoleteObject) { 
     this.ObjectContext.DeleteObject(obsoleteObject); 
    } 

    public void Detach(TEntity obsoleteObject) { 
     this.ObjectContext.Detach(obsoleteObject); 
    } 

    /// <summary> 
    /// Updates the changed entity object to the context. 
    /// </summary> 
    /// <param name="newObject">A new object.</param> 
    public virtual void Update(TEntity newObject) { 
     ObjectContext.ApplyPropertyChanges(newObject.GetType().Name, newObject); 
     ObjectContext.Refresh(RefreshMode.ClientWins, newObject); 
    } 

    public virtual TEntity LoadByKey(String propertyName, Object keyValue) { 
     IEnumerable<KeyValuePair<string, object>> entityKeyValues = 
      new KeyValuePair<string, object>[] { 
     new KeyValuePair<string, object>(propertyName, keyValue) }; 

     // Create the key for a specific SalesOrderHeader object. 
     EntityKey key = new EntityKey(this.ObjectContext.GetType().Name + "." + typeof(TEntity).Name, entityKeyValues); 
     return (TEntity)this.ObjectContext.GetObjectByKey(key); 
    } 

    #region IBaseDAO<TObjectContext,TEntity> Members 


    public bool validation(TEntity newObject) { 
     return newObject.GetType().Name.ToString() == "Int32"; 
    } 

    #endregion 
} 
+9

請告訴我你並沒有試圖保持一個連接打開所有的查詢。 – leppie 2010-11-10 10:59:30

+0

我忘了提及最重要的。無論它是mvc還是web表單都無所謂,但如果項目是使用.net實體開發的,那麼這很重要。所以,我想我已經回答了你的問題。感謝您通過方式回覆 – StrouMfios 2010-11-10 18:11:11

+0

您的意思是「通過實體框架進行管理」?請提供產生該異常的示例代碼。 – 2010-11-10 18:54:54

回答

2

不知道你是如何實例化你的ObjectContext,我我會在這裏的答案桶裏扔東西。

這是我做我的實體框架的命令和連接(至少簡單的小項目):

using (MyEntities context = new MyEntities()) 
{ 
    return context.getCategoriesStructure(); 
} 

您也可以選擇通過一個連接字符串中實例化的上下文時(如果沒有,它會使用您的app.config一):

new MyEntities("...connection string...") 

如果這沒有幫助您的問題,請幫助我們理解你的代碼有點張貼你如何創建ObjectContext更好。你至少可以嘗試這樣做,看看它是否有效;它會告訴你這是否是連接字符串的問題。

+0

謝謝!幫了我很多! – 2010-11-24 22:32:45