Я создаю модуль для использования в DNN 7+ и хотел бы использовать DAL2 для доступа к данным, но у меня возникли проблемы с выбором элементов из базы данных.
Мой код успешно подключается к базе данных, но запросы, генерируемые DAL2, не включают имена полей в таблице базы данных. Я запускаю SQL Server Profiler, чтобы посмотреть, что попадает в базу данных, и увидеть запросы, начинающиеся с «SELECT NULL FROM Product...». Я ожидаю увидеть "SELECT * FROM Product..." или "SELECT ProductCode FROM Product..."
Чтобы изолировать проблему и иметь возможность включить полный пример кода, я сократил свой тест до следующего: У меня есть файл Product.cs:
using System.Web.Caching;
using DotNetNuke.ComponentModel.DataAnnotations;
namespace MyModule.Components
{
[TableName("Product")]
[PrimaryKey("productCode")]
[Cacheable("MYMODULE_Product_", CacheItemPriority.Default, 20)]
[Scope("productCode")] //different values here did not change the result.
public class Product
{
public string productCode;
}
}
У меня есть файл ProductRepository.cs:
using DotNetNuke.Data;
namespace MyModule.Components
{
public class ProductRepository
{
private const string EXTERNAL_DB_CONNECTION_STRING = "MY_DB_CONNECTIONSTRING_NAME";
public Product GetProduct(string productCode)
{
Product t;
using (IDataContext ctx = DataContext.Instance(EXTERNAL_DB_CONNECTION_STRING))
{
var rep = ctx.GetRepository<Product>();
t = rep.GetById(productCode);
}
return t;
}
}
}
Я использую эти два файла в своем представлении со следующим кодом:
ProductRepository productRepo = new ProductRepository();
Product product = (Product)productRepo.GetProduct("MYCODE");
Во время выполнения этого кода я отслеживаю с помощью SQL Server Profiler и вижу, что выполняется следующий запрос:
exec sp_executesql N'SELECT NULL FROM [Product] WHERE [productCode]=@0',N'@0 nvarchar(4000)',@0=N'MYCODE'
Я не знаю, почему приведенный выше запрос выбора выбирает NULL. Я ожидаю список полей продукта из файла Product.cs или символ *.
Мое определение поля базы данных (как видно из древовидного представления Microsoft SQL Server Management Studio) для productCode:
productCode(PK, varchar(50), not null)
Я подключаюсь к внешней базе данных, а данные не связаны с конкретным модулем или порталом. Вот почему я указываю «productCode» в качестве Scope. Я не уверен, как правильно использовать Scope, когда данные не привязаны к порталу или модулю. Чтобы убедиться, что проблема не связана с атрибутом Scope в файле Product.cs, я протестировал переменную Scope со значениями «PortalId», «ModuleId», «productCode» и «Nothing». Все эти значения приводили к тому, что один и тот же запрос отображался в профилировщике SQL Server.
Я также проверил, полностью удалив атрибут Scope. Когда атрибут Scope не был включен, я увидел следующий запрос в SQL Server Profiler:
SELECT NULL FROM [Product]
Я не уверен, почему предложение WHERE было удалено при исключении атрибута Scope, но именно это показали результаты теста.
Эти тесты с атрибутом Scope заставили меня поверить, что это не связано с проблемой «SELECT NULL», которую я вижу, но я хотел включить ее сюда для полноты картины.
Может ли кто-нибудь помочь, почему это создает выбор с NULL и как мне заставить его выбирать мои данные?
Спасибо!