اگر از روش Fluent-API برای تنظیم و افزودن نگاشتهای کلاسها استفاده کنیم، با زیاد شدن آنها ممکن است در این بین، افزودن یکی فراموش شود یا کلا اضافه کردن دستی آنها در متد OnModelCreating آنچنان جالب نیست. میشود اینکار را به کمک Reflection سادهتر و خودکار کرد:
در این متد، در یک اسمبلی مشخص و فضای نامی در آن، به دنبال کلاسهایی از نوع EntityTypeConfiguration خواهیم گشت. در ادامه این کلاسها وهله سازی شده و به صورت خودکار به modelBuilder اضافه میشوند.
یک مثال کامل که بیانگر نحوه استفاده از متد فوق است:
در این مثال، در متد OnModelCreating بجای اضافه کردن دستی تک تک تنظیمات تعریف شده، از متد loadEntityConfigurations جهت یافتن آنها در اسمبلی جاری و فضای نام مشخصی به نام EFGeneral استفاده شده است.
void loadEntityConfigurations(Assembly asm, DbModelBuilder modelBuilder, string nameSpace) { var configurations = asm.GetTypes() .Where(type => type.BaseType != null && type.Namespace == nameSpace && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)) .ToList(); configurations.ForEach(type => { dynamic instance = Activator.CreateInstance(type); modelBuilder.Configurations.Add(instance); }); }
یک مثال کامل که بیانگر نحوه استفاده از متد فوق است:
using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Data.Entity.ModelConfiguration; using System.Linq; using System.Reflection; namespace EFGeneral { public class User { public int UserNumber { get; set; } public string Name { get; set; } } public class UserConfig : EntityTypeConfiguration<User> { public UserConfig() { this.HasKey(x => x.UserNumber); this.Property(x => x.Name).HasMaxLength(450).IsRequired(); } } public class MyContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // modelBuilder.Configurations.Add(new UserConfig()); var asm = Assembly.GetExecutingAssembly(); loadEntityConfigurations(asm, modelBuilder, "EFGeneral"); } void loadEntityConfigurations(Assembly asm, DbModelBuilder modelBuilder, string nameSpace) { var configurations = asm.GetTypes() .Where(type => type.BaseType != null && type.Namespace == nameSpace && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)) .ToList(); configurations.ForEach(type => { dynamic instance = Activator.CreateInstance(type); modelBuilder.Configurations.Add(instance); }); } } public class Configuration : DbMigrationsConfiguration<MyContext> { public Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } protected override void Seed(MyContext context) { context.Users.Add(new User { Name = "name-1" }); context.Users.Add(new User { Name = "name-2" }); context.Users.Add(new User { Name = "name-3" }); base.Seed(context); } } public static class Test { public static void RunTests() { Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); using (var context = new MyContext()) { var user1 = context.Users.Find(1); if (user1 != null) Console.WriteLine(user1.Name); } } } }