首页 技术 正文
技术 2022年11月19日
0 收藏 355 点赞 4,654 浏览 7122 个字

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里面的应用。



相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,000
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,512
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,358
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,141
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,771
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,849