افزودن خودکار کلاسهای تنظیمات نگاشتها در EF Code first
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۷/۱۰ ۰:۲۱
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
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);
}
}
}
}
modelBuilder.Configurations
.AddFromAssembly(Assembly.GetExecutingAssembly()) var enumerable = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.Select(type => type.Namespace)
.Distinct()
.Where(name => name != null &&
name == "DomainClasses.Mappings"); type.BaseType == typeof(BaseEntity)
public class EntityConfigurations
{
internal static void LoadEntityConfigurations(Assembly[] asm, DbModelBuilder modelBuilder)
{
if (asm == null) throw new ArgumentNullException(nameof(asm));
foreach (var configurations in asm.Select(assembly => assembly.GetTypes()
.Where(
type => type.BaseType != null &&
type.BaseType.IsGenericType &&
type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>))
.ToList()))
{
configurations.ForEach(type =>
{
dynamic instance = Activator.CreateInstance(type);
modelBuilder.Configurations.Add(instance);
});
}
}
} /// <summary>
///
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
EntityConfigurations.LoadEntityConfigurations(AppDomain.CurrentDomain.GetAssemblies(), modelBuilder);
} var desiredAsm = AppDomain.CurrentDomain.GetAssemblies() .Where(asm => asm.GetTypes().Any(t => t.Namespace == "DomainClasses.Mappings")); modelBuilder.Configurations.AddFromAssembly(desiredAsm);