A professional, production-ready library management system built with C# and Windows Forms, featuring role-based access control, real-time book inventory management, and secure SQLite database integration.
LibraryApp is a comprehensive desktop application designed to streamline library operations through an intuitive Windows Forms interface. The system implements enterprise-level authentication, role-based authorization, and efficient database management to handle book borrowing, returns, and user administration.
- Security-First Design: Parameterized SQL queries prevent injection attacks
- Role-Based Access Control: Separate interfaces for administrators and regular users
- Real-Time Inventory: Live updates of book availability status
- Scalable Architecture: Clean separation of concerns with three-tier architecture
- Production-Ready: Built with Entity Framework and ADO.NET for reliability
- Dual-role authentication system supporting both administrators and regular users
- Secure credential validation with parameterized queries
- Session management and role-based UI navigation
- Password-protected admin access
- Real-time book inventory displayed in DataGridView controls
- Book borrowing and return workflow with automatic status updates
- Borrower tracking system linking users to borrowed books
- Comprehensive book metadata display
- Admin panel for user account management
- User deletion capabilities with confirmation dialogs
- Separate user and admin authentication tables
- User activity tracking through borrower IDs
- SQLite integration for lightweight, portable data storage
- Entity Framework 6.4.4 for ORM capabilities
- Centralized DatabaseManager class following repository pattern
- Transaction-safe operations with proper connection handling
- Clean, intuitive Windows Forms design
- Responsive form navigation
- User-friendly message dialogs for operation feedback
- Professional UI component layout
| Technology | Version | Purpose |
|---|---|---|
| C# | 10.0 | Primary programming language |
| .NET Framework | 4.7.2 | Application framework |
| Entity Framework | 6.4.4 | ORM and database abstraction |
| ADO.NET | 4.7.2 | Direct database operations |
| Technology | Version | Purpose |
|---|---|---|
| SQLite | 3.13.0 | Embedded relational database |
| System.Data.SQLite | 1.0.117.0 | SQLite ADO.NET provider |
| System.Data.SQLite.EF6 | 1.0.117.0 | Entity Framework 6 support |
| Technology | Purpose |
|---|---|
| Windows Forms | Desktop GUI framework |
| System.Windows.Forms | Form controls and components |
| System.Drawing | UI rendering and graphics |
┌─────────────────────────────────────┐
│ Presentation Layer │
│ ┌─────────┐ ┌──────────────┐ │
│ │ Form1 │ │ AdminPanel │ │
│ │ (Login) │ │ BookPanel │ │
│ └─────────┘ └──────────────┘ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Business Logic Layer │
│ ┌─────────────────────────────┐ │
│ │ DatabaseManager │ │
│ │ (Repository Pattern) │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Data Access Layer │
│ ┌──────────┐ ┌──────────────┐ │
│ │ SQLite │ │ Entity │ │
│ │ Database │ │ Framework │ │
│ └──────────┘ └──────────────┘ │
└─────────────────────────────────────┘
-
Repository Pattern (
DatabaseManager.cs)- Centralized data access logic
- Abstraction over database operations
- Testable and maintainable code structure
-
Separation of Concerns
- UI layer (Forms) independent of data access
- Business logic isolated in DatabaseManager
- Database operations encapsulated
-
Dependency Injection (Constructor-based)
- DatabaseManager instantiated in form constructors
- Promotes loose coupling
-- Admin Table
CREATE TABLE Admin (
Username TEXT PRIMARY KEY,
Password TEXT NOT NULL
);
-- Users Table
CREATE TABLE Users (
Username TEXT PRIMARY KEY,
Password TEXT NOT NULL
);
-- Books Table
CREATE TABLE Books (
BookId TEXT PRIMARY KEY,
Title TEXT NOT NULL,
Author TEXT,
IsBorrowed INTEGER DEFAULT 0,
BorrowerId TEXT,
FOREIGN KEY (BorrowerId) REFERENCES Users(Username)
);Before running LibraryApp, ensure you have:
- Operating System: Windows 7 or later
- .NET Framework: Version 4.7.2 or higher (Download)
- Visual Studio: 2017 or later (recommended) or any C# compatible IDE
- NuGet: Package manager (included with Visual Studio)
-
Clone the repository
git clone https://github.com/ensuca/LibraryApp.git cd LibraryApp -
Restore NuGet packages
nuget restore LibraryApp.sln
Or in Visual Studio:
Tools → NuGet Package Manager → Restore NuGet Packages -
Build the solution
msbuild LibraryApp.sln /p:Configuration=Release
Or in Visual Studio:
Build → Build Solution(Ctrl+Shift+B) -
Run the application
cd bin/Release LibraryApp.exeOr in Visual Studio: Press F5
The application uses SQLite database (veritabani.db). Connection string is configured in:
- File:
DatabaseManager.cs:14 - Connection String:
Data Source=veritabani.db;Version=3;
To use a different database location, modify the connection string:
connection = new SQLiteConnection("Data Source=YOUR_PATH_HERE.db;Version=3;");// Regular user login
1. Launch LibraryApp.exe
2. Enter username and password
3. Click "Login" button
4. → BookPanel opens with available books
// Admin login
1. Launch LibraryApp.exe
2. Click "Admin Login" link
3. Enter admin credentials
4. Click "Admin Login" button
5. → AdminPanel opens with management tools// In BookPanel
1. View available books in DataGridView
2. Note the BookId of desired book
3. Enter BookId in "Book ID" field
4. Enter your UserId in "User ID" field
5. Click "Borrow Book" button
6. → Book status updates to "Borrowed"// In BookPanel
1. Enter BookId of borrowed book
2. Click "Return Book" button
3. → Book status resets to "Available"
4. → BorrowerId cleared from databaseLibraryApp/
│
├── Program.cs # Application entry point
├── Form1.cs # Login form (authentication)
├── Form1.Designer.cs # Login form UI design
├── AdminPanel1.cs # Administrator interface
├── AdminPanel1.Designer.cs # Admin panel UI design
├── BookPanel.cs # User book management interface
├── BookPanel.Designer.cs # Book panel UI design
├── BookPanel.resx # Book panel resources
├── DatabaseManager.cs # Data access layer (Repository)
│
├── App.config # Entity Framework configuration
├── packages.config # NuGet package dependencies
├── LibraryApp.csproj # Project file
├── LibraryApp.sln # Solution file
│
├── Properties/
│ └── AssemblyInfo.cs # Assembly metadata
│
├── bin/
│ └── Debug/
│ ├── LibraryApp.exe # Compiled executable
│ └── veritabani.db # SQLite database
│
├── packages/ # NuGet packages
└── obj/ # Build artifacts
All database queries use parameterized commands to prevent SQL injection attacks:
// Example from DatabaseManager.cs:26-34
command.CommandText = "SELECT COUNT(*) FROM Admin WHERE Username = @username AND Password = @password";
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", password);- Separate authentication tables for users and administrators
- UI components restricted based on user role
- Admin functions inaccessible to regular users
- Connection management with proper
Open()/Close()patterns - Clear parameter collections before reuse
- Transaction-safe database operations
✅ Single Responsibility Principle
- Each form handles one specific user interface
- DatabaseManager exclusively handles data operations
✅ DRY (Don't Repeat Yourself)
- Centralized database logic in DatabaseManager
- Reusable methods for common operations
✅ Separation of Concerns
- Clear boundaries between UI, business logic, and data access
- Forms depend on abstractions (DatabaseManager) not concrete implementations
DatabaseManager.cs - Clean, maintainable data access:
public bool ValidateUser(string username, string password, bool isAdmin)
{
connection.Open();
command.Parameters.Clear();
if (isAdmin)
command.CommandText = "SELECT COUNT(*) FROM Admin WHERE Username = @username AND Password = @password";
else
command.CommandText = "SELECT COUNT(*) FROM Users WHERE Username = @username AND Password = @password";
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", password);
int count = Convert.ToInt32(command.ExecuteScalar());
connection.Close();
return count > 0;
}This project demonstrates proficiency in:
- Desktop Application Development with Windows Forms
- Database Design and SQLite integration
- ORM Usage with Entity Framework 6
- Security Best Practices (parameterized queries, role-based access)
- Software Architecture (three-tier, repository pattern)
- Clean Code Principles (SOLID, DRY, separation of concerns)
- Version Control with Git
- Project Documentation and technical writing
- Password Hashing - Implement bcrypt/SHA-256 for secure password storage
- User Registration - Self-service account creation for new users
- Book Search & Filtering - Advanced search by title, author, ISBN
- Due Date System - Track borrowing periods and overdue books
- Report Generation - Export borrowing history and statistics
- Unit Testing - Implement comprehensive test coverage
- Logging - Add logging framework (NLog/Serilog)
- Modern UI - Migrate to WPF or .NET MAUI for cross-platform support
- Passwords stored in plain text (improvement planned)
- No email/notification system for overdue books
- Single-user application (no concurrent access control)
- Limited to Windows operating system
- Database Size: Handles thousands of book records efficiently
- Response Time: Sub-second query execution for typical operations
- Memory Footprint: Lightweight (~30MB RAM usage)
- Connection Pooling: Managed by ADO.NET provider
- Efficient Queries: Direct SQL with minimal overhead
- Data Binding: DataGridView uses data binding for performance
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow C# naming conventions (PascalCase for methods, camelCase for variables)
- Add XML documentation comments for public methods
- Write unit tests for new features
- Ensure code passes existing tests before submitting PR
This project is licensed under the MIT License - see the LICENSE file for details.
Enes Uca
- 🌐 Portfolio: ensuca.github.io
- 💼 LinkedIn: linkedin.com/in/enes-uca-41039327b
- 🐙 GitHub: @ensuca
- 📧 Email: enesuca55@gmail.com
- Entity Framework team for excellent ORM framework
- SQLite community for reliable embedded database
- Microsoft for comprehensive .NET Framework documentation
⭐ Star this repository if you find it useful! ⭐
Made with ❤️ and C#
C# ve Windows Forms ile geliştirilmiş, rol tabanlı erişim kontrolü, gerçek zamanlı kitap envanter yönetimi ve güvenli SQLite veritabanı entegrasyonu içeren profesyonel, üretime hazır bir kütüphane yönetim sistemi.
LibraryApp, sezgisel bir Windows Forms arayüzü aracılığıyla kütüphane işlemlerini kolaylaştırmak için tasarlanmış kapsamlı bir masaüstü uygulamasıdır. Sistem, kitap ödünç alma, iade ve kullanıcı yönetimi işlemlerini gerçekleştirmek için kurumsal düzeyde kimlik doğrulama, rol tabanlı yetkilendirme ve verimli veritabanı yönetimi uygular.
- Güvenlik Odaklı Tasarım: Parametreli SQL sorguları enjeksiyon saldırılarını önler
- Rol Tabanlı Erişim Kontrolü: Yöneticiler ve normal kullanıcılar için ayrı arayüzler
- Gerçek Zamanlı Envanter: Kitap kullanılabilirlik durumunun canlı güncellemeleri
- Ölçeklenebilir Mimari: Üç katmanlı mimari ile temiz endişe ayrımı
- Üretime Hazır: Güvenilirlik için Entity Framework ve ADO.NET ile geliştirilmiş
- Hem yöneticileri hem de normal kullanıcıları destekleyen çift rollü kimlik doğrulama sistemi
- Parametreli sorgularla güvenli kimlik bilgisi doğrulama
- Oturum yönetimi ve rol tabanlı UI navigasyonu
- Şifre korumalı yönetici erişimi
- DataGridView kontrollerinde görüntülenen gerçek zamanlı kitap envanteri
- Otomatik durum güncellemeleri ile kitap ödünç alma ve iade iş akışı
- Kullanıcıları ödünç alınan kitaplarla ilişkilendiren ödünç alan takip sistemi
- Kapsamlı kitap meta veri görüntüleme
- Kullanıcı hesabı yönetimi için yönetici paneli
- Onay diyalogları ile kullanıcı silme yetenekleri
- Ayrı kullanıcı ve yönetici kimlik doğrulama tabloları
- Ödünç alan kimlikleri aracılığıyla kullanıcı aktivite takibi
- Hafif, taşınabilir veri depolama için SQLite entegrasyonu
- ORM yetenekleri için Entity Framework 6.4.4
- Repository pattern izleyen merkezi DatabaseManager sınıfı
- Uygun bağlantı yönetimi ile işlem güvenli operasyonlar
- Temiz, sezgisel Windows Forms tasarımı
- Duyarlı form navigasyonu
- İşlem geri bildirimi için kullanıcı dostu mesaj diyalogları
- Profesyonel UI bileşen düzeni
| Teknoloji | Versiyon | Amaç |
|---|---|---|
| C# | 10.0 | Birincil programlama dili |
| .NET Framework | 4.7.2 | Uygulama framework'ü |
| Entity Framework | 6.4.4 | ORM ve veritabanı soyutlama |
| ADO.NET | 4.7.2 | Doğrudan veritabanı işlemleri |
| Teknoloji | Versiyon | Amaç |
|---|---|---|
| SQLite | 3.13.0 | Gömülü ilişkisel veritabanı |
| System.Data.SQLite | 1.0.117.0 | SQLite ADO.NET sağlayıcı |
| System.Data.SQLite.EF6 | 1.0.117.0 | Entity Framework 6 desteği |
| Teknoloji | Amaç |
|---|---|
| Windows Forms | Masaüstü GUI framework'ü |
| System.Windows.Forms | Form kontrolleri ve bileşenleri |
| System.Drawing | UI render ve grafik |
┌─────────────────────────────────────┐
│ Sunum Katmanı │
│ ┌─────────┐ ┌──────────────┐ │
│ │ Form1 │ │ AdminPanel │ │
│ │ (Giriş) │ │ BookPanel │ │
│ └─────────┘ └──────────────┘ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ İş Mantığı Katmanı │
│ ┌─────────────────────────────┐ │
│ │ DatabaseManager │ │
│ │ (Repository Pattern) │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ Veri Erişim Katmanı │
│ ┌──────────┐ ┌──────────────┐ │
│ │ SQLite │ │ Entity │ │
│ │ Database │ │ Framework │ │
│ └──────────┘ └──────────────┘ │
└─────────────────────────────────────┘
-
Repository Pattern (
DatabaseManager.cs)- Merkezi veri erişim mantığı
- Veritabanı işlemleri üzerinde soyutlama
- Test edilebilir ve sürdürülebilir kod yapısı
-
Endişelerin Ayrılması (Separation of Concerns)
- UI katmanı veri erişiminden bağımsız
- İş mantığı DatabaseManager'da izole
- Veritabanı işlemleri kapsüllenmiş
-
Bağımlılık Enjeksiyonu (Constructor tabanlı)
- DatabaseManager form constructor'larında örnekleniyor
- Gevşek bağlantıyı teşvik eder
-- Yönetici Tablosu
CREATE TABLE Admin (
Username TEXT PRIMARY KEY,
Password TEXT NOT NULL
);
-- Kullanıcılar Tablosu
CREATE TABLE Users (
Username TEXT PRIMARY KEY,
Password TEXT NOT NULL
);
-- Kitaplar Tablosu
CREATE TABLE Books (
BookId TEXT PRIMARY KEY,
Title TEXT NOT NULL,
Author TEXT,
IsBorrowed INTEGER DEFAULT 0,
BorrowerId TEXT,
FOREIGN KEY (BorrowerId) REFERENCES Users(Username)
);LibraryApp'i çalıştırmadan önce aşağıdakilere sahip olduğunuzdan emin olun:
- İşletim Sistemi: Windows 7 veya üzeri
- .NET Framework: Versiyon 4.7.2 veya üzeri (İndir)
- Visual Studio: 2017 veya üzeri (önerilen) veya herhangi bir C# uyumlu IDE
- NuGet: Paket yöneticisi (Visual Studio ile birlikte gelir)
-
Depoyu klonlayın
git clone https://github.com/ensuca/LibraryApp.git cd LibraryApp -
NuGet paketlerini geri yükleyin
nuget restore LibraryApp.sln
Veya Visual Studio'da:
Tools → NuGet Package Manager → Restore NuGet Packages -
Çözümü derleyin
msbuild LibraryApp.sln /p:Configuration=Release
Veya Visual Studio'da:
Build → Build Solution(Ctrl+Shift+B) -
Uygulamayı çalıştırın
cd bin/Release LibraryApp.exeVeya Visual Studio'da: F5'e basın
Uygulama SQLite veritabanı (veritabani.db) kullanır. Bağlantı dizesi şurada yapılandırılmıştır:
- Dosya:
DatabaseManager.cs:14 - Bağlantı Dizesi:
Data Source=veritabani.db;Version=3;
Farklı bir veritabanı konumu kullanmak için bağlantı dizesini değiştirin:
connection = new SQLiteConnection("Data Source=SİZİN_YOLUNUZ.db;Version=3;");// Normal kullanıcı girişi
1. LibraryApp.exe'yi başlatın
2. Kullanıcı adı ve şifre girin
3. "Giriş" butonuna tıklayın
4. → Mevcut kitaplarla BookPanel açılır
// Yönetici girişi
1. LibraryApp.exe'yi başlatın
2. "Yönetici Girişi" linkine tıklayın
3. Yönetici kimlik bilgilerini girin
4. "Yönetici Girişi" butonuna tıklayın
5. → Yönetim araçlarıyla AdminPanel açılır// BookPanel'de
1. DataGridView'de mevcut kitapları görüntüleyin
2. İstenen kitabın BookId'sini not edin
3. "Kitap ID" alanına BookId'yi girin
4. "Kullanıcı ID" alanına UserId'nizi girin
5. "Kitap Ödünç Al" butonuna tıklayın
6. → Kitap durumu "Ödünç Alındı" olarak güncellenir// BookPanel'de
1. Ödünç alınan kitabın BookId'sini girin
2. "Kitap İade Et" butonuna tıklayın
3. → Kitap durumu "Mevcut" olarak sıfırlanır
4. → BorrowerId veritabanından temizlenirLibraryApp/
│
├── Program.cs # Uygulama giriş noktası
├── Form1.cs # Giriş formu (kimlik doğrulama)
├── Form1.Designer.cs # Giriş formu UI tasarımı
├── AdminPanel1.cs # Yönetici arayüzü
├── AdminPanel1.Designer.cs # Yönetici paneli UI tasarımı
├── BookPanel.cs # Kullanıcı kitap yönetim arayüzü
├── BookPanel.Designer.cs # Kitap paneli UI tasarımı
├── BookPanel.resx # Kitap paneli kaynakları
├── DatabaseManager.cs # Veri erişim katmanı (Repository)
│
├── App.config # Entity Framework yapılandırması
├── packages.config # NuGet paket bağımlılıkları
├── LibraryApp.csproj # Proje dosyası
├── LibraryApp.sln # Çözüm dosyası
│
├── Properties/
│ └── AssemblyInfo.cs # Assembly meta verileri
│
├── bin/
│ └── Debug/
│ ├── LibraryApp.exe # Derlenmiş çalıştırılabilir
│ └── veritabani.db # SQLite veritabanı
│
├── packages/ # NuGet paketleri
└── obj/ # Derleme yapıları
Tüm veritabanı sorguları SQL enjeksiyon saldırılarını önlemek için parametreli komutlar kullanır:
// DatabaseManager.cs:26-34'ten örnek
command.CommandText = "SELECT COUNT(*) FROM Admin WHERE Username = @username AND Password = @password";
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", password);- Kullanıcılar ve yöneticiler için ayrı kimlik doğrulama tabloları
- UI bileşenleri kullanıcı rolüne göre kısıtlanmış
- Yönetici fonksiyonları normal kullanıcılar için erişilemez
- Uygun
Open()/Close()desenleri ile bağlantı yönetimi - Yeniden kullanımdan önce parametre koleksiyonlarını temizleme
- İşlem güvenli veritabanı işlemleri
✅ Tek Sorumluluk İlkesi (Single Responsibility Principle)
- Her form belirli bir kullanıcı arayüzünü yönetir
- DatabaseManager yalnızca veri işlemlerini yönetir
✅ DRY (Kendini Tekrar Etme)
- DatabaseManager'da merkezi veritabanı mantığı
- Yaygın işlemler için yeniden kullanılabilir metodlar
✅ Endişelerin Ayrılması (Separation of Concerns)
- UI, iş mantığı ve veri erişimi arasında net sınırlar
- Formlar somut uygulamalara değil soyutlamalara (DatabaseManager) bağımlı
DatabaseManager.cs - Temiz, sürdürülebilir veri erişimi:
public bool ValidateUser(string username, string password, bool isAdmin)
{
connection.Open();
command.Parameters.Clear();
if (isAdmin)
command.CommandText = "SELECT COUNT(*) FROM Admin WHERE Username = @username AND Password = @password";
else
command.CommandText = "SELECT COUNT(*) FROM Users WHERE Username = @username AND Password = @password";
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@password", password);
int count = Convert.ToInt32(command.ExecuteScalar());
connection.Close();
return count > 0;
}Bu proje aşağıdaki alanlarda yetkinlik gösterir:
- Windows Forms ile Masaüstü Uygulama Geliştirme
- Veritabanı Tasarımı ve SQLite entegrasyonu
- Entity Framework 6 ile ORM Kullanımı
- Güvenlik En İyi Uygulamaları (parametreli sorgular, rol tabanlı erişim)
- Yazılım Mimarisi (üç katmanlı, repository pattern)
- Temiz Kod İlkeleri (SOLID, DRY, endişelerin ayrılması)
- Git ile Versiyon Kontrolü
- Proje Dokümantasyonu ve teknik yazım
- Şifre Hash'leme - Güvenli şifre depolama için bcrypt/SHA-256 uygulaması
- Kullanıcı Kaydı - Yeni kullanıcılar için self-servis hesap oluşturma
- Kitap Arama ve Filtreleme - Başlık, yazar, ISBN ile gelişmiş arama
- Son Tarih Sistemi - Ödünç alma sürelerini ve gecikmiş kitapları takip
- Rapor Üretimi - Ödünç alma geçmişi ve istatistikleri dışa aktarma
- Birim Testleri - Kapsamlı test coverage uygulaması
- Loglama - Loglama framework'ü ekleme (NLog/Serilog)
- Modern UI - Çapraz platform desteği için WPF veya .NET MAUI'ye geçiş
- Şifreler düz metin olarak saklanıyor (iyileştirme planlanmış)
- Gecikmiş kitaplar için email/bildirim sistemi yok
- Tek kullanıcılı uygulama (eş zamanlı erişim kontrolü yok)
- Windows işletim sistemi ile sınırlı
- Veritabanı Boyutu: Binlerce kitap kaydını verimli şekilde işler
- Yanıt Süresi: Tipik işlemler için saniyenin altı sorgu yürütme
- Bellek Ayak İzi: Hafif (~30MB RAM kullanımı)
- Bağlantı Havuzu (Connection Pooling): ADO.NET sağlayıcı tarafından yönetilir
- Verimli Sorgular: Minimum overhead ile doğrudan SQL
- Veri Bağlama: DataGridView performans için veri bağlamayı kullanır
Katkılar memnuniyetle karşılanır! Lütfen şu yönergeleri takip edin:
- Depoyu fork edin
- Özellik dalı oluşturun (
git checkout -b feature/HarikaBirOzellik) - Değişikliklerinizi commit edin (
git commit -m 'Harika bir özellik ekle') - Dalı push edin (
git push origin feature/HarikaBirOzellik) - Pull Request açın
- C# adlandırma kurallarını takip edin (metodlar için PascalCase, değişkenler için camelCase)
- Public metodlar için XML dokümantasyon yorumları ekleyin
- Yeni özellikler için birim testleri yazın
- PR göndermeden önce kodun mevcut testleri geçtiğinden emin olun
Bu proje MIT Lisansı altında lisanslanmıştır - detaylar için LICENSE dosyasına bakın.
Enes Uca
- 🌐 Portföy: ensuca.github.io
- 💼 LinkedIn: linkedin.com/in/enes-uca-41039327b
- 🐙 GitHub: @ensuca
- 📧 E-posta: enesuca55@gmail.com
- Mükemmel ORM framework'ü için Entity Framework ekibine
- Güvenilir gömülü veritabanı için SQLite topluluğuna
- Kapsamlı .NET Framework dokümantasyonu için Microsoft'a
⭐ Faydalı bulduğunuzda bu depoyu yıldızlayın! ⭐
❤️ ve C# ile yapılmıştır