EntityFrameWork 实现实体类和DBContext分离在不同类库
在新建EF的时候,选择CodeFirst,会生成一个DBContext类似于下图,这个还是只有一个实体Score的时候,如果项目中实体很多,整个放在DBcontxt里面会显示的非常凌乱,这个时候咱们可以接着反射和EntityTypeConfiguration<T>来对内容进行分割
public partial class DBContext : DbContext { public DBContext() : base("name=DBContext") { } public virtual DbSet<Bird> Birds { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Birds>() .Property(e => e.Id); } }
这个时候,我们创建另外一个类库 TestEF.Data 在这个类库中,我们声明一个Map
public partial class BirdMap { partial void BirdMapAppend() { ToTable("ZX_Bird", "dbo"); this.Property(t => t.Id) .HasColumnName("Id") .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) .IsRequired(); this.Property(t => t.Name) .HasColumnName("Name") .IsRequired(); this.Property(t => t.Age) .HasColumnName("Age") .IsRequired(); } }
public partial class BirdMap: EntityTypeConfiguration<Bird> { /// <summary> /// Module-数据表映射构造函数 /// </summary> public BirdMap() { BirdMapAppend(); } /// <summary> /// 额外的数据映射 /// </summary> partial void BirdMapAppend(); /// <summary> /// 将当前实体映射对象注册到当前数据访问上下文实体映射配置注册器中 /// </summary> /// <param name="configurations">实体映射配置注册器</param> public void RegistTo(System.Data.Entity.ModelConfiguration.Configuration.ConfigurationRegistrar configurations) { configurations.Add(this); } }
然后修改DBContext
public class TestContext : DbContext { //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config) //使用“TestContext”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的 //“TestEF.TestContext”数据库。 // //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“TestContext” //连接字符串。 public TestContext() : base("name=TestContext") { } //public virtual DbSet<Bird> Birds { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //modelBuilder.Entity<Bird>() // .Property(e => e.Id); string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("TestEF.DLL", "TestEF.Data.DLL").Replace("file:///", ""); Assembly asm = Assembly.LoadFile(assembleFileName); var typesToRegister = asm.GetTypes() .Where(type => !String.IsNullOrEmpty(type.Namespace)) .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)); foreach (var type in typesToRegister) { dynamic configurationInstance = Activator.CreateInstance(type); modelBuilder.Configurations.Add(configurationInstance); } base.OnModelCreating(modelBuilder); } }
这样我们通过反射,获取TestEF.DLL 里面的具有继承父类,并且父类为泛型类,并且泛型父类类型为 typeof(EntityTypeConfiguration<>)的类,进行注册,这样我们在DBContext文件里面就会很简洁,并且在BirdMap类中可以配置表信息,是否主键,属性长度等等约束