一个业务领域由各个实体和各个相互关联且有格子的属性和行为的实体组成,每个实体都有其状态和验证规则需要维护,entity framework (后面简称ef)实体框架设计的出现是为了允许开发人员着重关注业务领域,开发人员就实体来建模。它产生的目的是为了解决企业快速开发和迭代出市场所需要的系统或者软件。下面我们介绍entity framework 中的三种领域建模方式。

1、code first

         code first 可以通过c#或者vb.net 来描述这些模型,然后通过类来创建数据库。这些类简称pojo(plian old crl object)。poco来源于java的pojo,其中j就是java,pojo是由马丁·富勒(martin fowler) 和其他人一同提出来的概念以反对在20世纪90年代早期受欢迎的javabeans。pojo概念提出的主要目标是显示域可以被成功建模,而不会带来与执行环境相关的复杂表(javabeans在早期版本中带来了很多),同时执行环境与域建模完全无关。pojo不能再.net中使用,因此有了具备pojo相同语义 的poco。这里的c指的是(common language runtime,clr通用语言运行时)中创建的一个简单对象。ef 4.0之前生成的每个类都是从entityobject基类继承而来的,因此带来了许多特定于ef的复杂性。而从ef 4.0开始,框架引入了poco数据模型,允许使用不从entityobject继承的类。使用code first 模型可以完全以面向对象的方式来工作而不必担心数据库的结构,这种抽象使我们能够创建更加灵活的应用程序。其优点如下:

1)、这是最受欢迎的领域建模方式,可以允许我们创建一个更富有的逻辑、更灵活的应用程序;

2)、因为没有自动生成的代码是难以修改的,所以它提供了我们对代码的 完全控制;

3)、通过这种方法我们只需要定义映射,其余一切交给ef来处理,包括创建数据库表以及表与表之间的关系;

4)、这种方式可以通俗易懂的成为代码定义数据库,所以不推荐对数据库的手动修改;

5)、我们可以使用它来映射表结构到一个已存在的数据库。

 

        栗子:vs2017 —>新建一个mvc项目—>右击项目引用—>管理neget程序包—>浏览搜索entityframework—>安装

       然后在models中添加两个类 student和class 表示学生表与班级表

 

 

  建立一个数据库上下文类 配置数据库链接字符串 在home控制器里面测试看看 

 <connectionstrings>
    <add name="sqlconn" connectionstring="data source=地址;initial catalog=basetestef;user id=sa; password=密码;multipleactiveresultsets=true" providername="system.data.sqlclient" />
  </connectionstrings 
using system.linq;
using system.web;

namespace ef3class.models
{
    public class wydb :dbcontext
    {
        public wydb() : base("sqlconn")
        {
            //默认的初始化器。这种初始化器在第一次运行程序时会创建数据库,再次运行不会再创建新的数据库。但是如果我们改变了领域类,运行程序时会抛出一个异常
            //database.setinitializer(new createdatabaseifnotexists<dbcontextwy>());

            //如果领域类发生了改变,删除以前的数据库,然后重建一个新的。采用这种初始化器不用再担心领域类改变影响数据库架构的问题。
            //database.setinitializer(new dropcreatedatabaseifmodelchanges<dbcontextwy>());

            //每次运行程序都会删除以前的数据库,重建新的数据库。如果在开发过程中每次都想使用最新的数据库,那么可以采用这种初始化器。
            database.setinitializer(new dropcreatedatabasealways<wydb>());
        }
        public dbset<student> student { get; set; }
        public dbset<class> class { get; set; }
    }
}

 

  顺序别反了,反了想知道啥效果自己测试一下。

public actionresult index()
        {
            wydb db = new wydb();
            var c = db.class.tolist();
            var s = db.student.tolist();
            return view();
        }

 

运行起来看数据库里面

 

 它就生成了对应的数据库,是复数的形式,也可以自己代码配置命名。后面几章会说。

 

 

2、model first

       model first 允许我们使用实体设计器在空模型(扩展名.edmx)中建模型实体及其关系个继承层次结构,然后创建数据库。在model first 方法中,创建实体模型是必须选择“空模型”,而不是从数据库生成。其优缺点如下:

1)、如果你喜欢可视化应用程序中的数据结构,或者不喜欢编写sql,那么它将被你喜欢,因为它会自动生成;

2)、在此方法中,我们无法控制实体和数据库,因为自动生成的代码难以修改,所以这种建模方式已经越来越不被开发者使用。但对于小型简单的项目它行之有效;

3)、要在poco是体重添加额外的功能,我们不得不修改t4模板或者使用部分类来完成;

4)、数据库模型的更改不是最佳选择,是由模板定义了数据库。

         栗子在models文件夹上 右键–>新建–>新建项–>数据–>ado.net实体数据模型,选择空模型,我的命名默认model1没改然后点击完成

         右击新增加–>实体

 

然后添加变量

 

 数据类型自己设置f4,右击表添加关联

 

 然后右击空白根据模型生成数据库就用刚刚的sqlconn链接,在链接字符包含敏感字符选上 后面会生成一个sql文件 右击执行(ececute)填连接字符串。连接就可以了

 

3、database first

database first 使我们能够从现有数据库(sql server 、oracle、db2等)创建模型,此方法减少了自动生成代码所编写的代码量,同时也限制了使用生成代码的结构。优缺点如下:

1)、如果我们已有bda设计的数据库来单独开发或现有已经存在的数据库,那么它将会作为首选;

2)、通过edm向导为我们创建实体、关系和继承层次结构,修改映射之后还可以生成poco实体;

3)、要在poco实体中添加额外的功能,必须通过t4修改模板或者使用部分类;

4)、数据库的手动更改变为可能,因为数据库定义了领域模型 ,如果要修改数据库表结构,只需要从数据库更新实体模型即可。

 

        栗子在models文件夹上 右键–>新建–>新建项–>数据–>ado.net实体数据模型,选择来自数据库的ef设计器,我的命名默认。选择表,视图,存储过程的 看自己需要。可以看到生成出来的直接替换了刚刚model first