在Code First模式中自动创建Entity模型
之前我在博客文章中介绍过如何使用Code First来创建数据库,通过CodeFirst的方式,可以大幅的减少开发人员的工作量,比传统的先创建库再ORM的方式简单了不少。但是,很多时候,特别是一些MIS系统,我们会涉及到大量的实体类型,类似如下所示:
public class DbContext : System.Data.Entity.DbContext { public DbContext() : base("name=DefaultConnection") { } public DbSet<Pencil> Penlils { get; set; } public DbSet<Pen> Pens { get; set; } public DbSet<Ink> Inks { get; set; } public DbSet<Eraser> Erasers { get; set; } //.... }
在常用的CodeFirst方式下,每增加一种类型就需要在DbContext中增加一个属性。虽然并不算麻烦,但这种手动维护的方式存在如下两个问题:
当实体类型较多且变更比较频繁的的时候,靠手动的方式维护实体列表很容易出错。
有的时候,客户并不会买整套产品,只需要里面的部分模块,手动维护的方式不方便模块的裁剪。
此时,就需要我们来实现动态创建实体模型了,Entity Framework中本身是支持动态创建实体模型的,上面的实体模型就可以通过如下方式动态创建:
public class DbContext : System.Data.Entity.DbContext { public DbContext() : base("name=DefaultConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Pencil>(); modelBuilder.Entity<Pen>(); modelBuilder.Entity<Ink>(); modelBuilder.Entity<Eraser>(); //.... } }
PS:修改成这样的方式后,原来的代码可能出现如下问题:DbContext中没有 Inks属性了。此时只需要将原来的对db.Inks的访问换成 db.Set<Ink>即可
结果上述操作后,虽然我们实现了动态创建,但实体类型还是手动添加的。因此我们还缺少一种实体类型的发现机制,这种发现机制在.net中实现还是比较简单的,这里我采用的是Attribute的方式。
首先写一个Attribute,
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public class PersistentAttribute : Attribute { }
然后将需要自动创建的实体用该Attribute标记,
[Persistent] public class Pen [Persistent] public class Ink
最后,根据标记的实体添加实体模型。
public class DbContext : System.Data.Entity.DbContext { public DbContext() : base("name=DefaultConnection") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); var assembly = this.GetType().Assembly; var entityTypes = from type in assembly.GetTypes() where type.GetCustomAttribute<PersistentAttribute>() != null select type; var entityMethod = typeof(DbModelBuilder).GetMethod("Entity"); foreach (var type in entityTypes) { entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { }); } } }
通过上述方法,就可以实现实体模型的自动创建了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Asp.Net平台下的图片在线裁剪功能的实现代码(源码打包)
最近项目中有个图片在线裁剪功能,本人查找资料,方法如下:前台展现用jquery.Jcrop实现,后台使用 System.Drawing.Image类来进行裁剪2011-10-10让Silverlight 2.0动画动起来Making Silverlight 2.0 animation Start(
Microsoft Expression Blend 2 制作动画个人感觉倒像3DMAX 可以自动捕捉关键帧2008-11-11ASP.NET Core使用MiniProfiler分析应用
这篇文章介绍了ASP.NET Core使用MiniProfiler分析应用的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-02-02
最新评论