ORM作为一种数据库訪问机制已广泛地应用于各种项目其中,在.Net开发中,应用比較广泛的ORM框架大致有以下几个:

官方支持的有:Linq to SQL。Entity Framework。三方的有:NHibernate。前面介绍过Linq to SQL的应用,这篇介绍一下Entity Framework在Asp.Net MVC4中的应用。

首先用Visual Studio(2012或2013,其他版本号须要安装Asp.Net MVC4)创建一个Asp.Net MVC4的项目,项目创建完毕后会发现Entity Framework已经被加入到项目其中并已经写好了一些主要的方法。

首先看项目引用References,会看到EntityFramework程序集。再看根文件夹以下的配置文件web.config会看到相关配置项:

<configSections>

<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />

</configSections>

<entityFramework>

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />

 </entityFramework>

也就是说对于没有包括Entity Framework的项目而言,假设想使用Entity Framework仅仅须要上面的步骤即可,加入程序集,然后加入配置文件节点信息(对于配置文件,怎么自己定义配置节点Section。我会在写完mvc4后的兴许博文中介绍)。上面步骤支持code first方式,但假设想用Entity Framework的可视化操作功能,那么须要安装Entity Framework工具。

以下来看看详细应用。

Entity Framework支持双方面的应用,Code First和Database First。

Code First即代码优先原则,也就是说先创建实体类。再依据实体类创建数据库。

第二种就是Database First即数据库优先原则,也就是说依据数据库来自己主动创建实体类。

先说第一方面的应用,Code First。

第一步:创建实体类。

直接执行刚创建的项目。会看到帐户管理功能已经做好了,打开注冊页面,注冊一个帐户完毕登陆,全部的功能全部已经包括在了创建的项目中。在注冊和登陆时文本框的验证功能也已经写好了,打开解决方式窗体,点击功能栏上的“显示全部文件”,打开App_Data目录,会看到有一个mdf的数据库文件,右键选择”加入到项目中“,打开数据库文件会看到帐户管理的全部表, 来看一下是怎样实现的。

打开Models目录,打开文件AccountModels文件,会看到UsersContext类。它继承自DbContext类。DbContext类为Entity Framework的基础。包含初始化数据库连接。Database类,DbSet类。实体验证DbEntityValidationResult。 实体类DbEntityEntry等。

public class UsersContext : DbContext

    {

        public UsersContext()

            : base("DefaultConnection")

        {

        }

public DbSet<UserProfile> UserProfiles { get; set; }      

    }

UserContext类创建一个构造函数并指定运行父类构造函数:public DbContext(string nameOrConnectionString);

DefaultConnection为连接字符串。能够查看配置文件:

<connectionStrings>

    <add name="DefaultConnection" connectionString="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" providerName="System.Data.SqlClient" />

</connectionStrings>

假设想自己定义数据库位置。那么能够改动DefaultConnection字符串到指定位置,或改动base("DefaultConnection")的connectionString名称。

DbSet为创建数据库表的方法,想要创建的表放在DbContext继承类内。

 [Table("UserProfile")]

    public class UserProfile

    {

        [Key]

        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

        public int UserId { get; set; }

        public string UserName { get; set; }

    }
上面是要创建的表的实体类,属性Table指定表名。也俗称注解字,注解字的功能不只针对于实体类。还有专门的属性方法作用于字段。[Key]指定表的主键。[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]则定义主键的生成方式。
注解字的还有一个作用就是在UI层面对用户输入的数据进行验证,将Model绑定到页面时,对应的字段与Html标签绑定,那么在字段上定义的各种规定就会用于验证用户的输入,当然在UI层须要@Html.ValidationSummary(true)的支持,不然注解字会被忽略。这个概念就是Model强类型绑定,也就是Model的意义所在。
来看看其他各种注解字,如:
public class LocalPasswordModel

    {

        [Required]

        [DataType(DataType.Password)]

        [Display(Name = "Current password")]

        public string OldPassword { get; set; }

        [Required]

        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]

        [DataType(DataType.Password)]

        [Display(Name = "New password")]

        public string NewPassword { get; set; }

        [DataType(DataType.Password)]

        [Display(Name = "Confirm new password")]

        [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]

        public string ConfirmPassword { get; set; }

    }

依据各属性名能够推断它们详细用于哪些方面的验证。这一部分内容会放在Htmlhelper里面详细解说,包含怎样实现自己定义的属性功能,即注解字功能。
写到这里面。我们会想到怎样创建数据库呢?来看看创建数据库的方法。打开Filters目录,打开InitializeSimpleMembershipAttribute类。它继承自ActionFilterAttribute属性类,Filter是一类能够自己定义的操作。特别是那些须要作用整个项目的操作,会在兴许博文介绍。
private static SimpleMembershipInitializer _initializer;

private static object _initializerLock = new object();

private static bool _isInitialized;

public override void OnActionExecuting(ActionExecutingContext filterContext)

        {

            // Ensure ASP.NET Simple Membership is initialized only once per app start

            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);

        }
上面为初始化方法,_initializer为初始化数据库类:
private class SimpleMembershipInitializer

        {

            public SimpleMembershipInitializer()

            {

                Database.SetInitializer<UsersContext>(null);
                try

                {

                    using (var context = new UsersContext())

                    {

                        if (!context.Database.Exists())

                        {

                            // Create the SimpleMembership database without Entity Framework migration schema

                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();

                        }

                    }
                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

                }

                catch (Exception ex)

                {

                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see ", ex);

                }

            }

        }
这个类的作用是指定数据库创建策略。并创建数据库。
Database.SetInitializer<UsersContext>(null); 可以详细指定数据库创建策略。有三种方式:
1. 假设參数为Null。那么默觉得CreateDatabaseIfNotExists,即假设不存在,那么创建数据库。
2. DropCreateDatabaseAlways,总是先删除再又一次创建新的数据库。

3. DropCreateDatabaseIfModelChanges, 删除再创建新的数据库,假设Model有变化。
应用方法为:
Database.SetInitializer<UsersContext>(new DropCreateDatabaseIfModelChanges<UsersContext>());

上面这些类是已经存在于MVC4项目中的Membership操作,那么如今来创建自己的实体类和数据库表。假设想创建一个所有的数据库。那么能够直接继承DbContext类,并自己定义自己的数据库连接字符串。假设保留Membership操作里面类和表。能够继承UserContext类。

简单一点,保留所有现有的功能。我仅仅须要继承UserConext。

public class DataGridContext : UsersContext

    {

        public DbSet<DataListForDemo> DataListForDemo { get; set; }

    }

先创建一个自己的Context类和实体表。
    [Table("DataListForDemo")]

    public class DataListForDemo

    {

        public int ID { get; set; }

        public string col1 { get; set; }

        public string col2 { get; set; }

        public string col3 { get; set; }

        public string col5 { get; set; }

               

        [DataType(DataType.Date, ErrorMessage="{0} should be a correct date")]

        public DateTime col4 { get; set; }

    }

执行项目,打开数据库会发现新表已经创建好了。这就是Code First的方法。应用Asp.Net MVC4的数据库持久化。

再来看看假设已经设计好数据库该怎么操作?



另外一种方式:Database First。

加入新项,选择Data,选择ADO.Net Entity Data Model,选择加入。

会看到导航界面,提供两种选择:从数据库生成和空Model。第一种方式会提供一个数据库连接,并能够选择须要创建哪些表、视图、存储过程、函数的实体类。另外一种方式则创建一个空的模板。

操作方式和Linq to SQL出入不大, 和code first相比,这个可图形化操作,文件夹提供EF 5.0和6.0两个版本号。对于复杂的数据库而言,这是一个非常好的方法。我们能够单独设计好数据库。依据须要创建须要的实体类。

採用这样的方式会在项目中创建一个.edmx后缀的文件中面包含了创建的实体类、实体SP、Function等,操作上没有太多差别。


 public virtual DbSet<C__MigrationHistory> C__MigrationHistory { get; set; }

        public virtual DbSet<DataListForDemo> DataListForDemo { get; set; }

        public virtual DbSet<UserProfile> UserProfile { get; set; }

        public virtual DbSet<webpages_Membership> webpages_Membership { get; set; }

        public virtual DbSet<webpages_OAuthMembership> webpages_OAuthMembership { get; set; }

        public virtual DbSet<webpages_Roles> webpages_Roles { get; set; }

   

        public virtual ObjectResult<TestLinqToSQL_Result> TestLinqToSQL()

        {

            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<TestLinqToSQL_Result>("TestLinqToSQL");

        }

可图形化操作。可自己主动生成代码等。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3MyNTg0NzU4NzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="width:406px; height:145px">




上面就是EF在Asp.Net MVC4里面应用的两种不同方式。第一种所有包括在了新建的项目中,另外一种则须要自己在已经创建好数据库的时候下新建。

下一篇介绍HTML5。 CSS3, JQuery和JQuery UI在mvc4里面的应用。





Asp.Net MVC4开发二: Entity Framework在Asp.Net MVC4中的应用的更多相关文章

  1. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  2. ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...

  3. Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1

    这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...

  4. MVC中使用EF(1):为ASP.NET MVC程序创建Entity Framework数据模型

    为ASP.NET MVC程序创建Entity Framework数据模型 (1 of 10) By  Tom Dykstra |July 30, 2013 Translated by litdwg   ...

  5. 源码学习之ASP.NET MVC Application Using Entity Framework

    源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...

  6. Asp.Net MVC 模型(使用Entity Framework创建模型类)

    这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...

  7. Working with Data » 使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

    原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web applica ...

  8. MVC4,MVC3,VS2012+ entity framework Migration from Sqlserver to Mysql

    在开发的初期个人认为因VS与Sqlserver的配合很默契,即可以方便的实现Code First,又可以使用SqlServer Manager很漂亮的进行建模与变更,也许是个人的使用习惯MS的界面做的 ...

  9. Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...

随机推荐

  1. fir.im Weekly - 嘘,关于***!

    上 Github 交友刷 StackOverflow 解惑,是攻城狮必备技能,加快打怪练级速度.关于,@左耳朵耗子 在微博上分享了一篇文档,轻一点教你建一个VPN服务器,重一点到教你在路由器上***, ...

  2. 初学Hadoop:利用VMWare+CentOS7搭建Hadoop集群

     一.前言 开始学习数据处理相关的知识了,第一步是搭建一个Hadoop集群.搭建一个分布式集群需要多台电脑,在此我选择采用VMWare+CentOS7搭建一个三台虚拟机组成的Hadoop集群. 注:1 ...

  3. python开发_difflib字符串比较

    在python的difflib中 HtmlDiff:比较后以html方法展示 我们比较的是字符串: 'hello world!' 和 'hElLO Wor2d!' 具体代码: from difflib ...

  4. [转]JSONObject,JSONArray使用手册

    您的评价:          收藏该经验       这两个是官网的API JSONObject API JSONArray API 里面有这两个类的所有方法,是不可多得的好材料哦~ 配合上面的API ...

  5. HDU 5645 DZY Loves Balls 水题

    DZY Loves Balls 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5645 Description DZY loves playing b ...

  6. SpringMVC 3.1.1版本下的单元测试WEB-INF路径问题

    假设Spring配置文件为applicationContext.xml 一.Spring配置文件在类路径下面 在Spring的java应用程序中,一般我们的Spring的配置文件都是放在放在类路径下面 ...

  7. Visual Studio 2010 使用 Git Extensions 连接 google code

    下载最新版本 Git Extensions http://code.google.com/p/gitextensions/downloads/list Git Extensions 2.46 Wind ...

  8. haitaolab.com 我的新网站,欢迎访问

    从博客园到csdn,再到新浪云博客,最近终于下决心购买空间和域名建立自己的独立网站! 在这里也建议希望建立自己独立博客的朋友尽快行动吧! 我的新的网站“海淘实验室”专注于介绍和分享海淘资讯,欢迎大家访 ...

  9. iOS网络编程解析协议二:XML数据传输解析

    XML两种解析方式,一种是SAX,NSXMLParser是SAX方法解析,另一种是DOM(Document Object Model); 区别: SAX: 只能读,不能修改,只能顺序访问,适合解析大型 ...

  10. C#文本文件(.txt)读写 [转]

    目录 前言 读取txt文件 写入txt文件 前言 计算机在最初只支持ASCII编码,但是后来为了支持其他语言中的字符(比如汉字)以及一些特殊字符(比如€),就引入了Unicode字符集.基于Unico ...