#c# #asp.net #razor-pages
Вопрос:
Хотите попробовать Dapper в качестве возможной замены EFCore.
У меня есть простое
Модель
public class CDItemFormModel { public int Id { get; set; } public string ItemForm { get; set; } public bool Active { get; set; } }
Доступ к базе данных SQL
public async Tasklt;IEnumerablelt;Tgt;gt; LoadDatalt;T, Ugt;(string storedProcedure, U parameters, string connectionId = "Default") { using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId)); return await connection.QueryAsynclt;Tgt;(storedProcedure, parameters, commandType: CommandType.StoredProcedure); }
Это вызывает SP, который возвращает данные в SSMS
public class CDItemFormData : ICDItemFormData { private readonly ISQLDataAccess _db; public CDItemFormData(ISQLDataAccess db) { _db = db; } // Get all Drug Forms public Tasklt;IEnumerablelt;CDItemFormModelgt;gt; GetCDItemForms() =gt; _db.LoadDatalt;CDItemFormModel, dynamicgt;("Products.spCDItemForm_GetAll", new { }); }
Во время тестирования я просто работаю с моделью индекса
public class IndexModel : PageModel { private readonly ILoggerlt;IndexModelgt; _logger; private readonly IConfiguration _configuration; private readonly ICDItemFormData _formData; public IEnumerablelt;CDItemFormModelgt; forms; public IndexModel(ILoggerlt;IndexModelgt; logger, IConfiguration configuration, ICDItemFormData formData) { _logger = logger; _configuration = configuration; _formData = formData; } public async void OnGet() { forms = await _formData.GetCDItemForms(); foreach( var item in forms) { Console.WriteLine(item.ItemForm); } } }
Простой div внутри IndexModel.cshtml
lt;divgt; lt;tablegt; lt;theadgt; lt;trgt; lt;thgt;IDlt;/thgt; lt;thgt;Formlt;/thgt; lt;thgt;Activelt;/thgt; lt;/trgt; lt;/theadgt; lt;tbodygt; @foreach (var item in Model.forms) { lt;trgt; lt;tdgt; @item.Id lt;/tdgt; lt;tdgt; @item.ItemForm lt;/tdgt; lt;tdgt; @item.Active lt;/tdgt; lt;/trgt; } lt;/tbodygt; lt;/tablegt; lt;/divgt;
Я добавил foreach в модель индекса для тестирования, и 3 строки из таблицы записываются в консоль. Проблема в том, что я получаю нулевую ссылку для «Ссылка на объект не установлена на экземпляр объекта»
У меня были аналогичные ошибки в EFCore, когда я неправильно обработал модель, и она была равна нулю, однако, поскольку строки возвращаются в консоль для меня, я не вижу, как модель равна нулю.
Комментарии:
1. Какая линия выбрасывает NRE?
2. @gunr2171 начало каждого в файле cshtml. Значение foreach в модели страницы не выдает NRE.
Ответ №1:
попробуйте добавить модель на страницу просмотра индекса
@page @model IndexModel @{ }
Ответ №2:
Я думаю, это было вызвано полной ошибкой новичка.
Если вы проверите мой метод loadData в моем DBAccess, он вернет задачу. Мой OnGet был установлен на недействительный, но изменил его на
public async Task OnGet() { forms = await _formData.GetCDItemForms(); }
исправлена проблема, и cshtml foreach теперь отображает каждую возвращенную строку. Я протестировал один возврат GetCDItemForm(1), и он также отображается правильно. Я должен предположить, что это была моя проблема с пустотой/задачей, которая вызвала это.
Пожалуйста, не стесняйтесь объяснить мне, если это не так просто, как я сказал.