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继承类内。
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
{
[Required]
[DataType(DataType.Password)]
[Display(Name = "Current password")]
public string OldPassword { get; set; }
[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; }
[Display(Name = "Confirm new password")]
[Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
}
private static object _initializerLock = new object();
private static bool _isInitialized;
{
// Ensure ASP.NET Simple Membership is initialized only once per app start
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
}
{
public SimpleMembershipInitializer()
{
Database.SetInitializer<UsersContext>(null);
{
using (var context = new UsersContext())
{
if (!context.Database.Exists())
{
// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
}
}
}
catch (Exception ex)
{
throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see ", ex);
}
}
}
{
public DbSet<DataListForDemo> DataListForDemo { get; set; }
}
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; }
}
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");
}
Asp.Net MVC4开发二: Entity Framework在Asp.Net MVC4中的应用,布布扣,bubuko.com