خودکار کردن تعاریف DbSetها در EF Code first
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۸/۲۷ ۲۱:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
using System;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using System.Reflection;
namespace MyNamespace
{
public abstract class BaseEntity
{
public int Id { set; get; }
public string CreatedBy { set; get; }
}
public class User : BaseEntity
{
public string Name { get; set; }
}
public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var asm = Assembly.GetExecutingAssembly();
loadEntities(asm, modelBuilder, "MyNamespace");
}
void loadEntities(Assembly asm, DbModelBuilder modelBuilder, string nameSpace)
{
var entityTypes = asm.GetTypes()
.Where(type => type.BaseType != null &&
type.Namespace == nameSpace &&
type.BaseType.IsAbstract &&
type.BaseType == typeof(BaseEntity))
.ToList();
var entityMethod = typeof(DbModelBuilder).GetMethod("Entity");
entityTypes.ForEach(type =>
{
entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { });
});
}
}
public class Configuration : DbMigrationsConfiguration<MyContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
protected override void Seed(MyContext context)
{
context.Set<User>().Add(new User { Name = "name-1" });
context.Set<User>().Add(new User { Name = "name-2" });
context.Set<User>().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.Set<User>().Find(1);
if (user1 != null)
Console.WriteLine(user1.Name);
}
}
}
}
var asm = Assembly.GetExecutingAssembly();
var asm = Assembly.GetAssembly(typeof(DomainModels.BaseEntity));
foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies())
{
Type t = currentassembly.GetType("typeName", false, true);
if (t != null) {return currentassembly.FullName;}
}var entityTypes = modelAssembly.GetTypes()
.Where(type => type.Namespace != null
&& (type.Namespace.StartsWith(domainNamespace)
&& type.CustomAttributes.All(c => c.AttributeType != typeof(ComplexTypeAttribute))
&& !type.IsAbstract && !type.IsEnum)
)
.OrderBy(c => c.CustomAttributes.Any(
x => x.AttributeType == typeof (EntityOrderAttribute)) ? c.GetCustomAttribute<EntityOrderAttribute>().OrderNumber : 100).ToList();The entity type User is not part of the model for the current context.
namespace Test.Domain
{
public abstract class BaseEntity
{
public int Id { set; get; }
}
}
namespace Test.Domain.Entities
{
public class User : BaseEntity
{
public int UserNumber { get; set; }
public string Name { get; set; }
}
}
namespace Test.Domain.Mappings
{
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
this.HasKey(x => x.UserNumber);
this.Property(x => x.Name).HasMaxLength(450).IsRequired();
}
}
} loadEntities(asm, modelBuilder, "Test.Domain");
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
//...
} loadEntities(asm, modelBuilder, "نام فضا");
context.Set<User>().Add(new User { Name = "name-1" }); entityTypes.ForEach(modelBuilder.RegisterEntityType);
var entityMethod = typeof (DbModelBuilder).GetMethod("Entity"); public class BloggingContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
loadEntities(modelBuilder,
asmPath: @"D:\Prog\SomeAsm1\bin\Debug\netstandard2.0\SomeAsm1.dll",
nameSpace: "SomeAsm1.Models");
base.OnModelCreating(modelBuilder);
}
private static void loadEntities(ModelBuilder modelBuilder, string asmPath, string nameSpace)
{
var modelInAssembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(asmPath);
// var modelInAssembly = Assembly.Load(new AssemblyName("ModuleApp"));
var entityMethod = typeof(ModelBuilder).GetMethod("Entity", new Type[] { });
foreach (var type in modelInAssembly.ExportedTypes)
{
if (type.BaseType is System.Object && !type.IsAbstract && type.Namespace == nameSpace)
{
entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { });
}
}
}