Рейтинг:
6
Christian Graus
Вы должны использовать entity framework и внедрить свою базу данных в код. Таким образом, вы вообще не управляете состоянием подключений к базе данных.
Но, если вы делаете это вручную, вы должны создать свое соединение в блоке using. Тогда ваш IDisposable на любом классе, который вы используете, должен отключиться для вас. Если вы этого не сделаете, то нет никаких оснований думать, что ваш класс контроллера найдет объекты в вашем методе и очистит их.
Если вы используете EF, это стоит прочитать:
Опасности подключения к базе данных с помощью Entity Framework - Brent Ozar Unlimited®[^]
По сути, entity framework идет вперед и пытается управлять соединениями для вас, поэтому закрытие соединений в основном борется с ним.
simple world
Эф независим?
Потому что, как я уже сказал, Я работаю только со страницами razor, а не с каким-либо mvc или ядром.
И у меня вообще нет никаких контроллеров.
Все мои файлы-это чисто файлы .cshtml.
Christian Graus
Вы используете рамки сущности? Может быть, и так. Если нет, то что вы используете для подключения к БД?
simple world
Взгляните на мою страницу AddProducts.cshtml, и вы все поймете.
@{
Макет = "~/_Admin/_SiteLayout.cshtml по";
Страница.Название = "Προσθήκη Προιόντων";
var db = база данных.Открытые("фильм на прокат");
WebImage photo = null;
var newFileName = "";
var imagePath = "";
если (IsPost)
{
//Получение значения текстового поля в строке
строка ProdName = запрос.Форма["prodname"];
стоимость строки = запрос.Форма["стоимость"];
описание строки = запрос.Форма["desc"];
сведений строки = запрос.Форма["подробности"];
string Class = запрос.Класс form"];
струнное топливо = запрос.Форма["топливо"];
струнные двери = запрос.Форма["двери"];
струнная коробка передач = запрос.Форма["коробка передач"];
фото = WebImage.GetImageFromRequest();
если (фото != null)
{
newFileName ="_" +
Path.GetFileName(фото.имя файла);
imagePath = @"/images\" + newFileName;
фото.Сохранить(@"~\" + путь_к_образу);
}
var sqlinsert = "вставить в продукты (ProdName,стоимость,описание,детали,класс,топливо,двери,коробка передач,ImagePath) значения(@0,@1,@2,@3,@4,@5,@6,@7,@8)";
db.Execute(sqlinsert, ProdName.toGreeklish(), стоимость, описание, детали, класс, топливо, двери, коробка передач, newFileName);
Ответ.Перенаправление("/_Admin/Products.cshtml");
}
}
И на каждой странице, где мне нужно что-то сделать в моей базе данных, я использую эту базу данных.Open(); в каждом файле
Christian Graus
О, вы все делаете в CSHTML? Это довольно грязно. У вас нет классов C#? Зачем вы делаете это таким образом?
Да, если вы создаете соединение с БД старой школы 2006 года, оно не закроется, если вы его не закроете.
simple world
Ну я только что закончил свою стажировку и решил начать учиться ASP.NET но поскольку я полный новичок даже в c#, я думал, что сделаю что-то подобное просто в качестве тестового проекта, а затем медленно построю в нем классы, которые мне нужны только для образовательных целей.
Но я не знаю, как закрыть соединение с БД, и в интернете почти нет информации о страницах razor.
Так что же вы предлагаете?
Christian Graus
Ты идешь в обратном направлении. Ты делаешь это с трудом. Используйте MVC, узнайте, как использовать Razor разумными способами, и не учитесь использовать его, чтобы делать то, что никто не делает :)
Если ваш класс соединения имеет метод Close, вы должны вызвать его :) В идеале, если он IDisposable, вы бы использовали его в операторе using
simple world
Что ж, думаю, мне еще многому предстоит научиться. Большое спасибо :)
Christian Graus
Не беспокойтесь. Эти фреймворки имеют так много битов, что сначала изучить некоторые базовые razor-это не ужасная идея, но вы перешли на такой уровень сложности, когда часть вашего кода должна жить в классе C#
simple world
Да, я знаю.
Первое, что я собираюсь сделать, это прочитать несколько PDF-файлов, чтобы сначала выучить c#.
Я принял твой ответ как решение.