EF有三种设计模式,前面的文章:EF中的DBFirst实例、尝试 Entity Framework POCO功能与CodeFirst的结合两篇文章已经为大家讲解了如何先设计数据库,之后根据数据库来设计实体数据模型以及如何先写代码,之后根据代码生成数据库、实体数据模型。今天就为大家讲解最后的一种设计模式:ModelFirst
一、新建项目
新建一个Web项目:EFModelFirst(具体过程不再累述),在该项目下添加一个Web页面Login.aspx,实现一个简单的用户注册以及登陆功能。再添加一个一般处理程序(不理解的可以参考我的另一篇文章:.net中的一般处理程序实例)LoginHandler.ashx。
二、新建实体数据模型
在项目的根目录下右击,选择添加新项->新建项->数据->ADO.Net 数据实体模型。可以修改实体数据模型的名称,在此将名称改为Demo.edmx。点击添加按钮,进入实体模型向导页面,选择空模型,点击完成。VS会默认问你打开一个实体数据模型设计器在该设计器内添加实体类User,添加属性Id,Password,具体过程不再讲述。
在实体数据模型设计器内右击->根据模型生成数据库,这是会出来一个生成数据库向导(都是一些SQL的脚本语言),单击完成,VS会默认打开一个页面。在该页面的右上角处选择运行,最后就会在数据库中生成一个User表(需要实现建立一个数据库)。
三、添加代码
1.Web页面
<body>
<form id="form1" runat="server">
<div style="text-align:center;">
<span>用户名</span><input type="text" name="username" value="" id="user" /><br />
<span>密码 </span><input type="text" name="password" value=" " id="password"/><br />
<input type="button" name="register" value="注册" id="reg"/>
<input type="submit" name="submit" value="登陆" id="sub"/>
</div>
</form>
<script type="text/javascript">
$(document).ready(function () {
$("#reg").click(function () {
$.post("LoginHandler.ashx", { "username": $("#user").val(), "password": $("#password").val(), "type": "register" },
function (msg) {
if (msg == "用户名已存在!") {
alert("该用户名已存在,请重新注册!");
}
if (msg == "请填写用户名密码") {
alert("请填写用户名密码!");
}
if (msg == "注册成功") {
alert("注册成功!");
}
}
);
})
$("#sub").click(function () {
$.post("LoginHandler.ashx", { "username": $("#user").val(), "password": $("#password").val(), "type": "submit" },
function (msg) {
if (msg == "请填写用户名密码") {
alert("请填写用户名密码!");
}
if (msg == "用户名或密码错误") {
alert("用户名或密码错误,请填写用户名密码!");
}
if (msg == "登陆成功") {
alert("登陆成功!");
}
})
})
})
</script>
</body>
2. 一般处理程序 LoginHandler.ashx
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//context.Response.Write("Hello World");
string user=context.Request["username"];
string password = context.Request["password"];
if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(password))
{
context.Response.Write("请填写用户名密码");
context.Response.End();
}
int username = Convert.ToInt16(user);
string type=context.Request["type"];
DemoContainer democontext = new DemoContainer();
if (type == "register") //注册事件
{
//var reslut = from c in democontext.User where c.Id == username select c;
IEnumerable<User> register = from c in democontext.User where c.Id == username select c;
foreach(var item in register)//此处有待简化
{
if (item != null)
{
context.Response.Write("用户名已存在!");
context.Response.End();
}
}
User reguser = new User();
reguser.Id = username;
reguser.Password = password;
democontext.User.AddObject(reguser);
democontext.SaveChanges();
context.Response.Write("注册成功");
context.Response.End();
}
else if (type == "submit")//登陆事件
{
var reslut = from c in democontext.User where c.Id == username&&c.Password==password select c;
foreach (var item in reslut)
{
if (item == null)
{
context.Response.Write("用户名或密码错误!");
context.Response.End();
}
}
context.Response.Write("登陆成功");
context.Response.End();
}
}
public bool IsReusable
{
get
{
return false;
}
}
四、测试
1.注册测试 2.登陆测试
五、总结
1.作为三种设计模式之一的ModelFirst与CodeFirst设计模式有很多相似之处,相似的地方是都需要先设计实体类,之后根据实体类更新数据库。不同之处是选择ModelFirst时EF会自动的为我们创建实体类上下文、实体类、映射等代码,比较方便;而CodeFirst是需要我们自己写实体类上下文、实体类、映射等代码,会有一点麻烦,也比较容易出错
2.三种设计模式有优有劣,由于没有怎么具体使用它们做过项目,不好下定论
3.前台代码的处理有后台代码还有一般处理程序两种处理方法。本篇选用的是一般处理程序的设计方法,当然也可以在页面的后台代码里面写处理方法
4.本篇对注册和登陆采用了JS中的异步提交的方式,其实本可以不使用此种方式,在这里看不出来异步的效果,在此使用只是为了练习使用
六、易犯错误
1.js异步提交数据提交格式不正确
2.Linq语句掌握不牢固,查询或添加数据出错
七、遗留问题
1.用户登陆以后不能弹出窗体(在JS中单步调试的时候却可以实现),百思不得其解。
2.异步提交值获取
方式一:
<script type="text/javascript">
$(document).ready(function () {
var username = $("#username").val();//""
var password = $("#password").val();//""
$("#reg").click(function () {
$.post("LoginHandler.ashx", { "username": username, "password": password, "type": "register" },
function (msg) {
if (msg == "用户名已存在!") {
alert("该用户名已存在,请重新注册!");
}
if (msg == "请填写用户名密码") {
alert("请填写用户名密码!");
}
if (msg == "注册成功") {
alert("注册成功!");
}
}
);
})
第一种方式异步提交时username以及password总是""(难道是和$(dicument).ready()有关?)
方式二:
$(document).ready(function () {
$("#reg").click(function () {
$.post("LoginHandler.ashx", { "username": $("#user").val(), "password": $("#password").val(), "type": "register" },
function (msg) {
if (msg == "用户名已存在!") {
alert("该用户名已存在,请重新注册!");
}
if (msg == "请填写用户名密码") {
alert("请填写用户名密码!");
}
if (msg == "注册成功") {
alert("注册成功!");
}
}
);
})
方式二却能够正确的提交数据
一直就看不明白,两者的差别究竟在哪里
在此将自己犯过的错误以及疑惑列举出来,希望大家以后再做类似的项目时尽量避免,也望各位大牛帮忙解除疑惑、给出指导!