EF中的ModelFirst设计实例

来源:互联网 发布:江苏省大数据交易中心 编辑:程序博客网 时间:2024/04/29 18:21

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("注册成功!");                     }                 }                 );             })

方式二却能够正确的提交数据
一直就看不明白,两者的差别究竟在哪里

在此将自己犯过的错误以及疑惑列举出来,希望大家以后再做类似的项目时尽量避免,也望各位大牛帮忙解除疑惑、给出指导!




0 0
原创粉丝点击