ASP.NET MVC / LINQ - получение таблиц и количества соединений - PullRequest
0 голосов
/ 08 августа 2010

Все еще чрезвычайно новый для всей вещи MVC / LINQ.Я нахожусь в процессе создания блога, и мне нужно создать таблицу для постов, а внутри каждого поста собрать таблицу для комментариев к этому посту.делать что-то вроде:

postsTable = (new DataContext(connectionString)).GetTable<Post>();

К сожалению, для каждой таблицы комментариев, это делает то же самое.Я вижу DataContext(connectionString) и предполагаю, что он подключается каждый раз.Мне кажется, что я должен иметь возможность подключиться один раз в начале выборки, а затем закрыть соединение, когда я закончу.Я делаю это неправильно?

Ответы [ 3 ]

0 голосов
/ 08 августа 2010

Поскольку вы выполняете LINQ to SQL, вы можете ...

  1. Определить таблицы блогов и комментариев в вашей базе данных с соответствующими отношениями внешнего ключа.
  2. Перетащите оба на вашу дизайнерскую поверхность DBML.Нажмите кнопку Сохранить;вот когда код генерируется.
  3. Когда вы заполняете свою модель представления (или, тем не менее, возвращаете данные в результат действия контроллера), запрашиваете только ту информацию, которая вам нужна в данный момент.

Для отдельного просмотра записи в блоге с соответствующими комментариями запрос LINQ может выглядеть так ...

    YourDataContext dataContext = new YourDataContext();
    var blogData = (from b in dataContext.Blogs
       where b.BlogId == 1
       select b).SingleOrDefault();

// you should now have a single blog instance with a property named Comments.  Set the 
// fetch mode to eager if you plan to always show the comments; leave it lazy to only do 
// the lookup if necessary.  Execute all of your queries/accesses before you pass 
// data to the view
0 голосов
/ 09 августа 2010

То, что вы ищете, это шаблон под названием «Сеанс / Контекст для запроса». Самый популярный и перекрестный ORM, перекрестный WebForms / MVC способ сделать это - в начале запроса создать новый контекст, запустить сеанс и, наконец, в конце вытащить его и удалить

От: http://blogs.microsoft.co.il/blogs/gilf/archive/2010/05/18/how-to-manage-objectcontext-per-request-in-asp-net.aspx

public static class ContextHelper<T> where T : ObjectContext, new()
{
  #region Consts

  private const string ObjectContextKey = "ObjectContext";

  #endregion

  #region Methods

  public static T GetCurrentContext()
  {
    HttpContext httpContext = HttpContext.Current;
    if (httpContext != null)
    {
      string contextTypeKey = ObjectContextKey + typeof(T).Name;
      if (httpContext.Items[contextTypeKey] == null)
      {
        httpContext.Items.Add(contextTypeKey, new T());
      }
      return httpContext.Items[contextTypeKey] as T;
    }
    throw new ApplicationException("There is no Http Context available");
  }

  #endregion
}

Вы также можете возиться с новым () вызовом DataContext в конструкторе контроллера, как показано здесь: http://www.stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-34-dispose-of-your-datacontext-or-don-t.aspx

Теперь в этой статье говорится, что вам не нужно беспокоиться об избавлении от контекста, но я не согласен. С современными ORM вы действительно хотите воспользоваться «сеансами», такими как способы отслеживания и сохранения изменений. Без ручного удаления вашего контекста все виды плохого кода или ужасных шаблонов рабочих единиц не будут генерировать исключения, как они должны. ИМХО сессионный аспект ORM является наиболее важной частью. Игнорировать на свой страх и риск.

Если вы используете SQL Server, функция пула подключений сводит на нет значительное влияние на производительность при открытии и закрытии подключения. Если вы не начнете делать 100 000 запросов в секунду, я бы об этом не беспокоился.

0 голосов
/ 08 августа 2010

Перейдите на http://www.asp.net/MVC и ознакомьтесь с учебными пособиями и стартовыми наборами. Есть множество хороших статей, которые покажут вам, что вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...