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. [POI2012]Squarks

    [POI2012]Squarks 题目大意: 设有\(n\)个互不相同的正整数\(\{X_1,X_2,...,X_n\}\),任取两个\(X_i,X_j(i\ne j)\),能算出\(X_i+X_j\ ...

  2. poj 2342 && hdu 1520 树形dp

    题意:有n个人,接下来n行是n个人的价值,再接下来n行给出l,k说的是l的上司是k,这里注意l与k是不能同时出现的 链接:点我 dp[i][1] += dp[j][0], dp[i][0] += ma ...

  3. 工作中用到的git命令

    1.git stash 将本地的修改藏匿,不进行commit也可切换分支 2.git stash apply 将之前藏匿的修改恢复出来 3.git cherry-pick commitId git在当 ...

  4. wampserver -- 取消PHP页面Warning和Notice级别的报错

    Learn from:http://yige.org/p/91 一般遇到这样的问题,有两个方法:1.如果有服务器权限,直接把服务器上的php.ini的配置改了,改成不输出Warning和Notice级 ...

  5. linq to datatable 和lambda查询datatable

    用Linq查询DataTable static DataTable table = new DataTable(); static DataColumn dc = new DataColumn(); ...

  6. Java--tomcat线程池(分析)

    以apache-tomcat-7.0.57 为例子 tomcat的默认配置如下: <Connector connectionTimeout="/> 默认的线程池为: maxThr ...

  7. javascript 手机号间隔显示 123 4567 8910

    // 手机号分隔显示 let tel = this.data.tel_value // 原始手机号 let len = tel_value.length // 原始手机号的长度 let mobile ...

  8. Ubuntu 16.04安装uafred用于替代Alfred

    说明: Macx下的Alfred非常强大,在Ubuntu下的替代为uafred,为什么选择uafred而不选择其它在于其功能开发简单,模块集成方便,不像别的实现是那种来回封装调用,其实就是一个功能而已 ...

  9. IOS常用的第三方开发库

    开发几个常用的开源类库及下载地址: 1.json json编码解码2.GTMBase64 base64编码解码3.TouchXML xml解析4.SFHFKeychainUtils 安全保存用户密码到 ...

  10. 配置druid内置的log实现

    Druid不依赖任何的log组件,但支持多种log组件,会根据检测当前环境,选择一种合适的log实现. log的优先顺序 log4j -> log4j2 -> slf4j -> co ...