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表(需要实现建立一个数据库)。

             

R forest_model参数 model a forest_用户名

                             

R forest_model参数 model a forest_User_02

三、添加代码
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.登陆测试                                    




           

R forest_model参数 model a forest_R forest_model参数_03

                                                            

R forest_model参数 model a forest_实体类_04



五、总结

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


方式二却能够正确的提交数据


一直就看不明白,两者的差别究竟在哪里



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