এনটিটি ফ্রেমওয়ার্ক কোর হলো মাইক্রোসফটের তৈরি একটি ওপেন সোর্স ডেটা একসেস টেকনোলজি। ক্রস প্ল্যাটফর্ম সফটওয়্যার ডেভেলপমেন্ট ফ্রেমওয়ার্ক ডটনেট কোরে অবজেক্ট রিলেশনাল ম্যাপিং এর জন্য এটি বহুল জনপ্রিয়।
কনফিগারেশান থেকে ডেটাবেজ কানেকশান স্ট্রিং নেয়া
var connectionString = Configuration.GetConnectionString("MusicAppDatabase");
সার্ভিস কনফিগারেশন
services.AddDbContext<MusicAppContext>(options => options.UseSqlServer(connectionString));
পুলিং করে কনটেক্সট ইনস্ট্যান্স পুনর্ব্যবহারের মাধ্যমে থ্রুপুট বাড়ানো
services.AddDbContextPool<MusicAppContext>(options => options.UseSqlServer(connectionString));
স্থিতিস্থাপকতাঃ ডেটাবেজে কানেকশান পেতে ব্যর্থ হলে পুনরায় চেষ্টা করা
services.AddDbContext<MusicAppContext>(options => options.UseSqlServer(connectionString, provider => provider.EnableRetryOnFailure()));
এনটিটি সেটে ইউজার ডিফাইন্ড টাইপ প্রকাশের মাধ্যমে মডেলে এনটিটি অনর্ভুক্ত করা
class MusicAppContext : DbContext
{
public DbSet<Music> Musics { get; set; }
}
ন্যাভিগেশন প্রপার্টি ডিফাইন করে মডেলে এনটিটি অনর্ভুক্ত করা
class Music
{
public Genre Genre { get; set; }
}
মডেলে এনটিটির অন্তর্ভুক্তি বাদ দেয়া
[NotMapped]
ম্যানুয়ালি টেবিলের নাম ডিফাইন করা
[Table("Musics")]
নির্দিষ্ট স্কিমাতে টেবিল তৈরি করা
[Table("Musics", Schema="Sangeet")]
টেবিলের কলামের এনটিটি প্রপার্টি অপেক্ষা ভিন্ন নাম দেয়া
[Column("Music_Id")]
কলামের ডেটাটাইপ
[Column(TypeName = "varchar(200)")], [Column(TypeName = "decimal(3, 2)")]
সর্বোচ্চ দৈর্ঘ্য
[MaxLength(500)]
সর্বোচ্চ দৈর্ঘ্য
[MinLength(8)]
আবশ্যক প্রপার্টি
[Required]
ঐচ্ছিক প্রপার্টি
public string? Caption { get; set; }
প্রাইমারী কী ডিফাইন করা
[Key]
ওয়ান-টু-ম্যানি (একটি কবিতা একজন কবি লিখেছেন, একজন কবি অনেকগুলো কবিতা লিখেছেন)
modelBuilder.Entity<Poem>()
.HasOne(p => p.Poet)
.WithMany(p => p.Poems);
সিঙ্গেল ন্যাভিগেশন প্রপার্টি
modelBuilder.Entity<Poet>()
.HasMany(p => p.Poems)
.WithOne();
একটি রিলেশনশীপে নির্দিষ্ট একটি প্রপার্টিকে ফরেইন কী হিসেবে ডিফাইন করা
modelBuilder.Entity<Poem>()
.HasOne(p => p.Poet)
.WithMany(p => p.Poems)
.HasForeignKey(p => p.PoetForeignKey);
ডেটাবেজের টেবিলে ফরেইন কী এর ভিন্ন নাম দেয়া
HasConstraintName("UserDefinedName");
ম্যানি-টু-ম্যানি রিলেশনশীপ-১
modelBuilder.Entity<SingerSong>()
.HasOne(ss => ss.Singer)
.WithMany(s => s.SingerSong)
.HasForeignKey(ss => ss.SingerId);
ম্যানি-টু-ম্যানি রিলেশনশীপ-২
modelBuilder.Entity<SingerSong>()
.HasOne(ss => ss.Song)
.WithMany(s => s.SingerSong)
.HasForeignKey(ss => ss.SongId);
ইগার লোডিং
var poets = context.Poets.Include(poet => poet.Poems).ToList();
এক্সপ্লিসিট লোডিং
context.Entry(loadedObject).Collection(l => l.PropotiesOfLoadedObject).Load();
স্ট্রাকচার্ড কুয়েরি ল্যাঙ্গুয়েজ
context.Poets.FromSqlRaw("SELECT * FROM dbo.Poets").ToList();
সাবকুয়েরি কম্পোজিশন
context.Poets.FromSqlInterpolated("...query...")
.Where(...)n .OrderByDescending(....)n .ToList()
ডেটাবেজ কনটেক্সটের ব্যবহার
using (var context = new MusicAppContext()) { // usage }
ডেটাবেজের একটি টেবিলে ডেটা সন্নিবেশ করাঃ ১
context.Add<Music>(newMusicObject);
ডেটাবেজের একটি টেবিলে ডেটা সন্নিবেশ করাঃ ২
context.Musics.Add(newMusicObject);
ডেটাবেজের একটি টেবিলে ডেটা সন্নিবেশ করাঃ ৩
context.Entry(newMusicObject).State = EntityState.Added;
ডেটাবেজের একটি টেবিলে ডেটা হালনাগাদ করাঃ ১
context.Update<Music>(MusicObject);
ডেটাবেজের একটি টেবিলে ডেটা হালনাগাদ করাঃ ২
context.Entry(MusicObject).State = EntityState.Modified;
ডেটাবেজের একটি টেবিলে ডেটা ডিলিট করাঃ ১
context.Remove(MusicObject);
ডেটাবেজের একটি টেবিলে ডেটা ডিলিট করাঃ ২
context.Entry(MusicObject).State = EntityState.Deleted;
উপরোক্ত সকল অপারেশনের পর ডেটাবেজে পরিবর্তন করা
context.SaveChanges();
মডেলে এনটিটি অন্তর্ভুক্ত করা
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Genre>();
}
মডেলে এনটিটির অন্তর্ভুক্তি বাদ দেয়া
modelBuilder.Ignore<TypeName>();
ম্যানুয়ালি টেবিলের নাম ডিফাইন করা
modelBuilder.Entity<Music>().ToTable("Musics");
নির্দিষ্ট স্কিমাতে টেবিল তৈরি করা
modelBuilder.Entity<Music>().ToTable("Musics", schema: "Sangeet");
টেবিলের কলামের এনটিটি প্রপার্টি অপেক্ষা ভিন্ন নাম দেয়া
modelBuilder.Entity<Music>().Property(b => b.MusicId).HasColumnName("Music_Id");
কলামের ডেটাটাইপ
modelBuilder.Entity<Music>(m => {
m.Property(x => x.Url)
.HasColumnType("varchar(200)");
m.Property(x => x.Rating)
.HasColumnType("decimal(5, 2)");
});
সর্বোচ্চ দৈর্ঘ্য
modelBuilder.Entity<Music>().Property(x => x.Url).HasMaxLength(600);
প্রাইমারী কী ডিফাইন করা
modelBuilder.Entity<Citizen>().HasKey(c => c.NationalId);
কম্পোজিট কী
modelBuilder.Entity<Citizen>()
.HasKey(c => new { c.NationalId, c.BioMetricCode });
মডেলের পরিবর্তনগুলো মাইগ্রেশন করা
dotnet ef migrations add <AnyMigrationName>
সর্বশেষ মাইগ্রেশন বাতিল করা
dotnet ef migrations remove
সকল মাইগ্রেশনকে লিস্ট আকারে দেখা
dotnet ef migrations list
সর্বশেষ মাইগ্রেশন অনুযায়ী ডেটাবেজে হালনাগাদ করা
dotnet ef database update
একটি নির্দিষ্ট মাইগ্রেশন অনুযায়ী ডেটাবেজে হালনাগাদ করা
dotnet ef database update <AvailableMigrationName>