QuickAndSimpleSQL 1.0.0

dotnet add package QuickAndSimpleSQL --version 1.0.0
                    
NuGet\Install-Package QuickAndSimpleSQL -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="QuickAndSimpleSQL" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="QuickAndSimpleSQL" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="QuickAndSimpleSQL" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add QuickAndSimpleSQL --version 1.0.0
                    
#r "nuget: QuickAndSimpleSQL, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package QuickAndSimpleSQL@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=QuickAndSimpleSQL&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=QuickAndSimpleSQL&version=1.0.0
                    
Install as a Cake Tool

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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