Entity Framework在Asp.Net MVC4中的应用(转载http://blog.csdn.net/cs258475870/article/details/28591137 )

    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");               

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

 
 上面就是EF在Asp.Net MVC4里面应用的两种不同方式,第一种全部包含在了新建的项目中,第二种则需要自己在已经创建好数据库的时候下新建。下一篇介绍HTML5, CSS3, JQuery和JQuery UI在mvc4里面的应用。
posted on 2014-12-01 18:44  烟灭  阅读(199)  评论(0)    收藏  举报