QuickAndSimpleSQL 1.0.0
dotnet add package QuickAndSimpleSQL --version 1.0.0
NuGet\Install-Package QuickAndSimpleSQL -Version 1.0.0
<PackageReference Include="QuickAndSimpleSQL" Version="1.0.0" />
<PackageVersion Include="QuickAndSimpleSQL" Version="1.0.0" />
<PackageReference Include="QuickAndSimpleSQL" />
paket add QuickAndSimpleSQL --version 1.0.0
#r "nuget: QuickAndSimpleSQL, 1.0.0"
#:package QuickAndSimpleSQL@1.0.0
#addin nuget:?package=QuickAndSimpleSQL&version=1.0.0
#tool nuget:?package=QuickAndSimpleSQL&version=1.0.0
ExamDbKit
ExamDbKit — библиотека поверх Entity Framework Core для быстрого выполнения демоэкзамена по разработке информационной системы (09.02.07-2 Для программистов).
По сути под капотом здесь используется EF м ClosedXML, что позволяет быстрее справится с частью по интеграции БД и импорта xlsx табличек
Полезные функции:
- SQLite подключение;
- базовый
DbContext; - справочники
RolesиOrderStatuses; enumдля ролей и статусов;- универсальный CRUD;
- авторизация по логину/паролю;
- поиск по строковым полям;
- фильтрация и сортировка;
- импорт Excel через ClosedXML;
- работа с изображениями;
- проверки перед удалением;
- простая валидация форм.
1. Подключение к проекту
В WPF/WinForms проекте добавьте ссылку на проект библиотеки:
dotnet add reference ../ExamDbKit/ExamDbKit.csproj
Или подключите .csproj через Visual Studio/Rider: Add → Project Reference.
2. Че, почему и вообще зачем
В основном проекте вы создаете свои модели User, Product, Order, OrderItem, но реализуете простые интерфейсы из библиотеки:
public class User : ILoginUser
{
public int Id { get; set; }
public string Login { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty;
public int RoleId { get; set; }
}
public class Product : IEntity
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
}
После этого можно использовать универсальные сервисы:
var productService = new CrudService<AppDbContext, Product>(db);
var products = productService.GetAll();
3. AppDbContext
Создайте свой AppDbContext, унаследованный от ExamDbContextBase:
public class AppDbContext : ExamDbContextBase
{
public AppDbContext() : base(SqlitePathHelper.InAppFolder("demoexam.db"))
{
}
public DbSet<User> Users => Set<User>();
public DbSet<Product> Products => Set<Product>();
protected override void ConfigureExamModel(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>(entity =>
{
entity.ToTable("Users");
entity.HasKey(x => x.Id);
entity.Property(x => x.Login).IsRequired();
entity.Property(x => x.Password).IsRequired();
entity.HasOne(x => x.Role)
.WithMany()
.HasForeignKey(x => x.RoleId)
.OnDelete(DeleteBehavior.Restrict);
});
modelBuilder.Entity<Product>(entity =>
{
entity.ToTable("Products");
entity.HasKey(x => x.Id);
});
}
}
ExamDbContextBase уже создает справочники:
Roles;OrderStatuses.
4. Создание базы
В WPF можно вызвать в App.xaml.cs:
protected override void OnStartup(StartupEventArgs e)
{
DbBootstrapper.EnsureCreated(() => new AppDbContext());
base.OnStartup(e);
}
Для полной пересборки БД во время тестов:
DbBootstrapper.Recreate(() => new AppDbContext());
На экзамене лучше использовать EnsureCreated, чтобы случайно не удалить данные =)
5. Авторизация
using var db = new AppDbContext();
var auth = new AuthService<AppDbContext, User>(db);
var user = auth.Login(loginTextBox.Text, passwordBox.Password);
if (user == null)
{
MessageBox.Show(UiText.InvalidLoginOrPassword, UiText.ErrorTitle);
return;
}
if (AuthService<AppDbContext, User>.IsAdmin(user))
{
// показать кнопки администратора
}
6. CRUD
using var db = new AppDbContext();
var service = new CrudService<AppDbContext, Product>(db);
service.Add(new Product
{
Name = "Кроссовки",
Price = 3500,
QuantityInStock = 10
});
var product = service.GetById(5);
if (product != null)
{
product.Price = 3990;
service.Update(product);
}
service.DeleteById(5);
7. Поиск + фильтр + сортировка
var products = db.Products
.Include(x => x.Supplier)
.Include(x => x.Category)
.Include(x => x.Manufacturer)
.ToList();
var result = ListPipeline<Product>
.From(products)
.Search(searchText, "Name", "Article", "Description", "Supplier.Name", "Category.Name", "Manufacturer.Name")
.WhereIf(selectedSupplierId != null, x => x.SupplierId == selectedSupplierId)
.SortBy(x => x.QuantityInStock, descending: true)
.ToList();
8. Запрет удаления товара, если он есть в заказах
DeletionGuard.ThrowIfHasDependencies<OrderItem>(
db,
x => x.ProductId == productId,
"Нельзя удалить товар, потому что он есть в заказах.");
productService.DeleteById(productId);
9. Валидация формы
var validation = ExamValidator.Create()
.Required(product.Name, "Наименование")
.GreaterThanZero(product.Price, "Цена")
.NonNegative(product.QuantityInStock, "Количество на складе");
if (!validation.IsValid)
{
MessageBox.Show(validation.ToMessage(), UiText.WarningTitle);
return;
}
10. Работа с изображениями
var relativePath = ImageService.CopyImageToImagesFolder(selectedFilePath);
product.ImagePath = relativePath;
Если изображения нет:
var path = ImageService.GetImageOrPlaceholder(product.ImagePath);
Физический размер изображения лучше ограничить в интерфейсе:
<Image Source="{Binding ImagePath}" MaxWidth="300" MaxHeight="200" Stretch="Uniform" />
11. Импорт Excel
var products = ExcelImportService.ReadRows(
"Tovar.xlsx",
row => new Product
{
Article = ExcelImportService.Text(row, 1),
Name = ExcelImportService.Text(row, 2),
Price = ExcelImportService.Decimal(row, 4),
QuantityInStock = ExcelImportService.Int(row, 9)
});
db.Products.AddRange(products);
db.SaveChanges();
12. Что важно для демки
Эта библиотека не должна скрывать структуру БД (а то эксперты дадут по шее). Таблицы, ключи и связи все равно нужно явно описывать в AppDbContext.
Правильный подход, если вы не хотите, чтобы вас спалили за использованием такой библиотеки:
- БД ОБЯЗАТЕЛЬНО должна оставаться нормализованной;
RolesиOrderStatusesостаются таблицами;enumиспользуется только для быстрых проверок в коде;- CRUD, поиск, фильтры и импорт вынесены в готовые сервисы.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- ClosedXML (>= 0.105.0)
- Microsoft.EntityFrameworkCore.Sqlite (>= 9.0.15)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 54 | 5/28/2026 |