在上一篇中我们介绍到继承了DbContext的子类,该子类代码如下:
public partial class GraduateChooseSubjectEntities : DbContext
{
public GraduateChooseSubjectEntities()
: base("name=GraduateChooseSubjectEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<login> login { get; set; }
public virtual DbSet<roles> roles { get; set; }
}
现在来一个实例,new一个GraduateChooseSubjectEntities
public ViewResult InsertData()
{
var roles = new List<MVC1.Models.roles>
{
new roles {RoleId = 5,RoleName = "SysAdmin"},
new roles {RoleId = 6,RoleName = "CollegeAdmin"},
new roles {RoleId = 7,RoleName = "***"},
new roles {RoleId = 8,RoleName = "Root"}
};
GraduateChooseSubjectEntities db=new GraduateChooseSubjectEntities();
roles.ForEach(r=>db.roles.Add(r));
db.SaveChanges();
return View();
}
当new一个DbContext子类的实例时会去调用DbContext类的构造函数
base(“name=GraduateChooseSubjectEntities”)
Dbcontext类的构造函数如下:
由构造函数我们可以知道DbContext子类实际通过调用父类的构造方法获取数据库连接字符串来创建数据操作对象。
在Web.config下的数据库连接字符串如下:
<add name="GraduateChooseSubjectEntities" connectionString="metadata=res://*/Models.graduate.csdl|res://*/Models.graduate.ssdl|res://*/Models.graduate.msl;provider=System.Data.SqlClient;provider connection string="data source=MYPC;initial catalog=GraduateChooseSubject;integrated security=True;connect timeout=15;encrypt=False;trustservercertificate=True;applicationintent=ReadWrite;multisubnetfailover=False;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
在ViewResult中:
roles.ForEach(r=>db.roles.Add(r));
db.SaveChanges();
通过Lambda表达式把要插入数据库的对象打上添加标记,只有当db.SaveChanges(); 语句执行时才会生成Sql语句并执行,把数据插入到数据库。
注意:
roles.ForEach(r=>db.roles.Add(r));执行后并没有往数据库插入数据
接下来看一下查询操作:
在控制器中新建一个ViewResult:
public ViewResult QueryRoles()
{
//Roles属于IQueryable<roles>类型
GraduateChooseSubjectEntities db = new GraduateChooseSubjectEntities();
var Roles = from r in db.roles
where r.RoleId < 4
select r;
ViewData["r"] = Roles;
return View();
}
对应的QueryRoles.cshtml如下:
@{
ViewBag.Title = "QueryRoles";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>QueryRoles</h2>
<div>
<table id="tb">
<tr>
<th>Id</th>
<th>Role</th>
</tr>
@foreach (var role in (IQueryable<MVC1.Models.roles>) ViewData["r"])
{
@:<tr>
@:<td>@role.RoleId</td>
@:<td>@role.RoleName</td>
@:</tr>
}
</table>
</div>
通过Linq语句查询出来的Roles 的类型,查询的结果可能有多个对象,
这里的Roles是IQueryable< roles > 类型,如果不清楚查询出来的结果可以用隐式推断var 推断其类型。
ASP.NET MVC框架定义了ViewContext类, 直译后是”View上下文”,
其中保存和View有关的所有数据, Model对象也封装在了此类型中.
ViewContext对象包含三个属性:
IView View
ViewDataDictionary ViewData
TempDataDictionary TempData
其中ViewData集合和TempData集合都是用来保存Model对象的。
return View()语句会返回一个ViewResult对象, 并且接下来要
执行ViewResult的Executeresult方法.
Controller的View方法会将Controller类的ViewData和TempData属性值传递给ViewResult.
ViewData属于键值对类型,属于弱类型集合,所以可以用以下方法直接给键值对集合赋值:
ViewData["r"] = Roles;
ViewData["键"] = 值;
由于弱类型集合ViewData传递数据给视图,所以要在视图里访问传递过来的数据需要进行强制转换。
(IQueryable < MVC1.Models.roles > ) ViewData[“r”]
另外在Razor引擎里把 @: 用于阻止Razor将此行解释为一条C#语句,一行文本如未使用@:字符,Razor默认将此行视图是一条C#语句。
@model声明通过动作方法传递给该视图模型对象的类型
@Model用来引用视图模型对象的方法、字段和属性