2010-11-10 2 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

+0

Я забыл упомянуть самое важное. Неважно, если это mvc или веб-формы, но дело в том, что проект разработан с помощью .net-объектов. Итак, я думаю, что я отвечаю на ваш вопрос. Спасибо за ответ кстати – StrouMfios

+0

Вы имеете в виду «управляемый через Entity Framework»? Просьба представить пример кода, который создает это исключение. –

ответ

2

Не зная, как вы инстанцировании свой ObjectContext, я «Брось что-нибудь в ответное ведро.

Это, как я делаю Entity Framework команды и соединения (для небольших простых проектов, по крайней мере):

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

Вы также можете передать в строке соединения при создании экземпляра контекста (если нет, то он будет использовать в вашем app.config):

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

Если это не поможет ваш вопрос, пожалуйста, помогите нам понять ваш код немного лучше, размещая, как вы создаете свой ObjectContext. Вы могли бы по крайней мере попытаться сделать это таким образом, чтобы увидеть, работает ли это; который скажет вам, является ли это проблемой для вашей строки подключения или нет.

+0

Спасибо человеку! мне очень помогли! –

Смежные вопросы