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. [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)

    3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 650  Solved: 28 ...

  2. WC2018伪题解

    NOIP分数过低的场外选手,一个月之后才有幸膜到这套卷子.感觉题目质量很不错啊,可惜了T1乱搞可过,T2题目出锅非集训队员没有通知到,导致风评大幅被害. 感觉Cu的话随手写两个暴力就稳了,Ag的话T3 ...

  3. 91网漏洞打包#越权+爆破+存储xss可打cookie

    漏洞一.主站存在登录口爆破 抓包,爆破一下 爆破成功 漏洞二.检测app时一处存储xss 在app登录后 我要提问那里插入xss 然后弹窗 可以打到cookie 漏洞三.app个人资料处平行越权可查看 ...

  4. bzoj 1030

    dp[i][j] 表示,在AC自动机中,从根节点开始,走了i条边,并且经过的点不包含危险节点,走到了j节点的路径数. 收获: 1.正难则反 2.一个字符串不包含给定pattern中的任何一个,则该字符 ...

  5. Java反射机制涉及的类常见方法使用总结

    import java.lang.reflect.Constructor; import java.lang.reflect.*; /*Class:代表一个字节码文件的对象,每当有类被加载进内存,JV ...

  6. 我弄的一些TASKER配置

    http://tieba.baidu.com/p/2184969007 我弄的一些配置,需要的童鞋们找自己想要的吧,有些配置感觉还是很繁琐,请高手不吝赐教才好,图片太多,就发链接了. ◆保持屏幕开启, ...

  7. Two PWM outputs from MCU combine to form a monotonic 16-bits DAC

    http://www.edn.com/design/analog/4329365/Combine-two-8-bit-outputs-to-make-one-16-bit-DAC

  8. 静态资源(StaticResource)和动态资源(DynamicResource)

    静态资源(StaticResource)和动态资源(DynamicResource) 资源可以作为静态资源或动态资源进行引用.这是通过使用 StaticResource 标记扩展或 DynamicRe ...

  9. win8升级8.1提示卸载sentinel runtime drivers

    Win8升级8.1时提示需卸载sentinel runtime drivers的解决方法 第一步:打开sentinelcustomer.safenet-inc.com/sentineldownload ...

  10. FIS3中使用less

    安装插件: npm install -g fis-parser-less npm install -g fis3-postpackager-loader 配置:fis-conf.js 使用fis-pa ...