ABP Framework ile Ad?m Ad?m Yaz?l?m Geli?tirme ? B?l?m 3: Veri Modeli Olu?turma
Her uygulaman?n temelinde bir veri modeli bulunur. ABP Framework, veri modelinizi tan?mlaman?z ve veritaban?yla etkile?im kurman?z i?in g??l? ara?lar ve prensipler sunar. Bu b?l?mde, entity’ler olu?turmaktan veritaban? migrasyonlar?na kadar olan s?reci ad?m ad?m inceleyece?iz.
Entity Kavram? ve Entity Olu?turma
Entity (Varl?k), uygulaman?z?n i? d?nyas?ndaki benzersiz bir nesneyi temsil eden bir s?n?ft?r. Her entity’nin benzersiz bir kimli?i (Id) vard?r ve ya?am d?ng?s? boyunca durumu de?i?ebilir. ABP Framework’te bir s?n?f? entity olarak tan?mlamak i?in Volo.Abp.Domain.Entities.Entity<TKey> s?n?f?ndan t?retilir.
?rnek bir Book entity’si:
C#
using System;
using Volo.Abp.Domain.Entities;
namespace MyProject.Books
{
public class Book : Entity<Guid>
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
// Ek ?zellikler
}
public enum BookType
{
Undefined,
Adventure,
ScienceFiction,
Fantasy,
Horror
}
}
Aggregate Root ve IEntity Interface’i
Aggregate Root, DDD’de bir dizi ilgili nesnenin (entity’ler ve de?er nesneleri) tutarl?l???n? sa?layan ana entity’dir. Bir aggregate root’un d??ar?dan eri?ilebilen tek public varl??? kendisidir; i?erideki di?er entity’lere ve de?er nesnelerine do?rudan eri?im engellenir.
ABP’de bir entity’yi aggregate root olarak i?aretlemek i?in Volo.Abp.Domain.Entities.AggregateRoot<TKey> s?n?f?ndan t?retilir:
C#
using Volo.Abp.Domain.Entities;
namespace MyProject.Books
{
public class Book : AggregateRoot<Guid> // Art?k bir Aggregate Root
{
public string Name { get; set; }
// ... di?er ?zellikler
}
}
IEntity interface’i, bir nesnenin bir entity oldu?unu ve bir kimli?e sahip oldu?unu belirten temel bir aray?zd?r. Entity ve AggregateRoot s?n?flar? bu aray?z? zaten implemente eder.
Entity ?zellikleri ve Varsay?lan Alanlar (Id, CreationTime, vb.)
ABP Framework, entity’ler i?in bir?ok faydal? varsay?lan ?zellik sunar. Bu ?zellikler, belirli aray?zleri implemente ederek entity’lerinize otomatik olarak eklenebilir:
Id:Entity<TKey>veyaAggregateRoot<TKey>kullan?larak otomatik olarak eklenir. GenellikleGuidveyainttipindedir.ICreationAudited:CreationTimeveCreatorIdalanlar?n? ekler. Bir kay?t olu?turuldu?unda otomatik olarak doldurulur.IModificationAudited:LastModificationTimeveLastModifierIdalanlar?n? ekler. Bir kay?t g?ncellendi?inde otomatik olarak doldurulur.IDeletionAudited:IsDeleted,DeletionTimeveDeleterIdalanlar?n? ekler. “Soft delete” (yumu?ak silme) ?zelli?i i?in kullan?l?r.IVersionedEntity:ExtraPropertiesveConcurrencyStampgibi alanlar ekleyerek e?zamanl?l?k kontrol? sa?lar.
?rnek: Denetlenebilir bir Book entity’si:
C#
using System;
using Volo.Abp.Domain.Entities.Auditing;
namespace MyProject.Books
{
public class Book : FullAuditedAggregateRoot<Guid> // Hem yaratma, hem de?i?tirme, hem de silme denetimi
{
public string Name { get; set; }
public BookType Type { get; set; }
public DateTime PublishDate { get; set; }
public float Price { get; set; }
}
}
EF Core Entegrasyonu ve DbContext Yap?land?rmas?
ABP Framework, veritaban? etkile?imi i?in varsay?lan olarak Entity Framework Core (EF Core) kullan?r. YourProjectName.EntityFrameworkCore projesinde bulunan YourProjectNameDbContext s?n?f?, uygulaman?z?n veritaban? ba?lam?n? temsil eder.
Bu s?n?f, AbpDbContext<YourProjectNameDbContext> s?n?f?ndan t?retilir ve DbSet ?zellikleri arac?l???yla entity’lerinizi veritaban? tablolar?na e?le?tirirsiniz:
C#
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using MyProject.Books;
[ConnectionStringName("Default")]
public class MyProjectDbContext : AbpDbContext<MyProjectDbContext>
{
public DbSet<Book> Books { get; set; }
public MyProjectDbContext(DbContextOptions<MyProjectDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
/* Configure your own tables/entities inside here */
builder.Entity<Book>(b =>
{
b.ToTable(MyProjectConsts.DbTablePrefix + "Books",
MyProjectConsts.DbSchema);
b.ConfigureByConvention(); // Auto configure for the base properties
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
}
}
OnModelCreating metodu, entity’lerinizin veritaban? tablolar?na nas?l e?le?tirilece?ini (tablo ad?, kolon adlar?, k?s?tlamalar vb.) yap?land?rman?za olanak tan?r. ConfigureByConvention() ABP’nin varsay?lan mapping kurallar?n? uygulamas?n? sa?lar.
Code First Yakla??m? ile Migration Olu?turma
ABP Framework, EF Core’un Code First yakla??m?n? ve Migrations ?zelli?ini kullanarak veritaban? ?eman?z? kodunuzdan y?netmenizi sa?lar.
- Migration Ekleme: Entity’lerinizde veya DbContext’inizde de?i?iklik yapt???n?zda, Package Manager Console (PMC) veya komut sat?r? (CLI) ?zerinden yeni bir migration olu?turursunuz:
- PMC:
Add-Migration "Added_Books_Table"(TodoApp.EntityFrameworkCore projesini se?ti?inizden emin olun) - CLI:
dotnet ef migrations add "Added_Books_Table" -p src/TodoApp.EntityFrameworkCore
- PMC:
- Bu komut, veritaban? ?emas?nda yap?lan de?i?iklikleri tan?mlayan bir C# dosyas? olu?turur.
Veritaban? ?emas?n? G?ncelleme
Migration dosyas? olu?turulduktan sonra, bu migration’? veritaban?n?za uygulamal?s?n?z:
- PMC:
Update-Database(TodoApp.EntityFrameworkCore projesini se?ti?inizden emin olun) - CLI:
dotnet ef database update -p src/TodoApp.EntityFrameworkCore
ABP projelerinde genellikle YourProjectName.DbMigrator ad?nda ayr? bir proje bulunur. Bu proje, uygulaman?z?n ilk ba?lang?c?nda veya manuel olarak ?al??t?r?larak veritaban? migrasyonlar?n? otomatik olarak uygulaman?za ve ba?lang?? verilerini (seed data) eklemenize olanak tan?r.
Seed Data Olu?turma
Uygulaman?z?n ilk ?al??mas?nda veya belirli senaryolar i?in varsay?lan veriler olu?turmak isteyebilirsiniz (?rn. y?netici kullan?c?s?, temel roller, ba?lang?? kategorileri). Buna Seed Data denir.
ABP’de seed data olu?turmak i?in IDataSeeder interface’ini implemente eden servisler kullanabilirsiniz. Bu servisler, YourProjectNameDbMigrationModule veya benzeri bir mod?l i?erisinde ?a?r?larak veritaban? ba?lat?l?rken ?al??t?r?l?r.
?rnek bir BookStoreDataSeeder s?n?f?:
C#
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using MyProject.Books;
namespace MyProject
{
public class MyProjectDataSeeder : IDataSeeder, ITransientDependency
{
private readonly IRepository<Book, Guid> _bookRepository;
public MyProjectDataSeeder(IRepository<Book, Guid> bookRepository)
{
_bookRepository = bookRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (await _bookRepository.GetCountAsync() <= 0)
{
await _bookRepository.InsertAsync(
new Book
{
Name = "1984",
Type = BookType.ScienceFiction,
PublishDate = new DateTime(1949, 6, 8),
Price = 19.84f
},
autoSave: true
);
await _bookRepository.InsertAsync(
new Book
{
Name = "The Hitchhiker's Guide to the Galaxy",
Type = BookType.ScienceFiction,
PublishDate = new DateTime(1979, 10, 12),
Price = 42.0f
},
autoSave: true
);
}
}
}
}
Bu b?l?m, veri modelinizi olu?turma ve veritaban? etkile?imini y?netme s?recini kapsamaktad?r. Sonraki b?l?mde, domain katman?n?z? nas?l geli?tirece?inizi ??renece?iz.