iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >在CodeFirst模式中自动创建Entity模型
  • 894
分享到

在CodeFirst模式中自动创建Entity模型

2024-04-02 19:04:59 894人浏览 薄情痞子
摘要

之前我在博客文章中介绍过如何使用Code First来创建数据库,通过CodeFirst的方式,可以大幅的减少开发人员的工作量,比传统的先创建库再ORM的方式简单了不少。但是,很多时

之前我在博客文章中介绍过如何使用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[] { });
            }
        }
    }

通过上述方法,就可以实现实体模型的自动创建了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: 在CodeFirst模式中自动创建Entity模型

本文链接: https://www.lsjlt.com/news/152125.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在CodeFirst模式中自动创建Entity模型
    之前我在博客文章中介绍过如何使用Code First来创建数据库,通过CodeFirst的方式,可以大幅的减少开发人员的工作量,比传统的先创建库再ORM的方式简单了不少。但是,很多时...
    99+
    2024-04-02
  • Python设计模式创建型原型模式
    目录一、原型模式二、应用场景三、代码示例一、原型模式 原型是相对于复制、克隆而言的,但是不同于模板,模板创造出的东西是一模一样,而原型创造出的东西是允许存在差异化和个性化的。 原型模...
    99+
    2024-04-02
  • Python 设计模式中的创建型建造者模式
    目录一、建造者模式二、代码示例一、建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)...
    99+
    2024-04-02
  • Python设计模式中的创建型工厂模式
    目录一、工厂模式(Factory Pattern)二、应用场景三、编码示例1、简单工厂模式2、工厂方法模式3、抽象工厂模式一、工厂模式(Factory Pattern) 工厂模式(F...
    99+
    2024-04-02
  • 在Django中创建自己的自定义用户模型
    目录1. Django安装2.创建Django应用3.该应用程序的自定义模型4.迁移模型自定义用户模型有什么需求? 创建自己的自定义用户模型至关重要。将来,如果要对模型进行一些更改,...
    99+
    2024-04-02
  • .Net创建型设计模式之原型模式(Prototype)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、 原型模式的具体实现六、原型模式的实现要点:1、原型模式的优点:2、原型模...
    99+
    2024-04-02
  • Python 设计模式创建型单例模式
    目录一、单例模式二、应用场景三、编码示例1.单线程中的单例模式方式一、重载类构造器方式二、实现单例装饰器2.多线程中的单例模式方式三、重载具有线程锁的类构造器一、单例模式 单例模式,...
    99+
    2024-04-02
  • Entity Framework Core基于数据模型创建数据库
    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序。使用迁移(Migrations)基于数据模型创建数据库,你可以...
    99+
    2024-04-02
  • java中有几种创建型模式
    java中有几种创建型模式?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方...
    99+
    2023-05-31
    java 模式 中有
  • Java如何创建型模式
    这篇文章主要为大家展示了“Java如何创建型模式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何创建型模式”这篇文章吧。创建型模式创建型模式的作用就是创建对象,说到创建一个对象,最熟悉...
    99+
    2023-06-02
  • Java创建型设计模式之单例模式
    目录介绍优点实现饿汉式懒汉式静态内部类枚举介绍 单例模式是一种创建型设计模式,其主要特点包括: 只有一个实例:单例模式确保系统中只有一个实例对象存在,所有对该对象的访问都是对同一个对...
    99+
    2023-05-18
    Java单例模式 Java创建型设计模式
  • Java创建型模式之建造者模式怎么实现
    这篇文章主要介绍了Java创建型模式之建造者模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java创建型模式之建造者模式怎么实现文章都会有所收获,下面我们一起来看看吧。一.介绍建造者模式(Build...
    99+
    2023-07-05
  • Java创建型设计模式之建造者模式详解
    目录前言定义结构实现方法应用场景总结建造者模式是Java中一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程分解为多个简单对象的构建过程,并且使这些构建过程按照一定的顺序进行...
    99+
    2023-05-19
    Java建造者模式 Java建造者模式实践 Java创建型设计模式
  • Python设计模式中的创建型工厂模式怎么用
    这篇文章主要介绍Python设计模式中的创建型工厂模式怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、工厂模式(Factory Pattern)工厂模式(Factory Pattern),提供了一种实例化(创...
    99+
    2023-06-29
  • Java 深入理解创建型设计模式之原型模式
    1.思考问题 现在有一只羊 tom,姓名为: tom,年龄为:1,颜色为:白色,请编写程序创建和 tom羊属性完全相同的10只羊。 按照传统的思路来,我们可能会按照下面的方式去写。 ...
    99+
    2024-04-02
  • Django中怎么创建模型
    这篇文章主要介绍了Django中怎么创建模型,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在Django框架中,我们经常会听到模型这个词,在mvc模式中也有提及过。结合之前所...
    99+
    2023-06-14
  • Java 深入理解创建型设计模式之建造者模式
    1.提出问题 假如说,我们需要建房子:这一过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的.3)请编写程序,完成需求。 传...
    99+
    2024-04-02
  • .Net创建型设计模式之建造者、生成器模式(Builder)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、建筑者模式的具体实现六、建造者模式的实现要点1、建造者模式的优点:2、建造...
    99+
    2024-04-02
  • 一文带你了解Java创建型设计模式之原型模式
    目录原型模式概述优缺点应用场景主要角色原型模式的基本使用创建原型接口创建具体需要克隆对象使用JDK自带原型接口的使用浅克隆与深度克隆浅克隆深度克隆单例的破坏原型模式 概述 原型模式(...
    99+
    2024-04-02
  • .Net创建型设计模式之工厂方法模式(Factory Method)
    目录一、动机(Motivation)二、意图(Intent)三、结构(Structure)四、模式的组成五、工厂方法模式的代码实现六、Factory Method模式的几个要点1、工...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作