Asp.net ModelFirst

关于ModelFirst

相比DBFirst ,ModelFirs使用相对更多一点,这种先建立实体模型,再根据实体模型生成数据库的方式相对更加方便,符合思维一些。

Asp.net 使用ModelFirst设计模式
1. 创建

Asp.net ModelFirst_第1张图片Asp.net ModelFirst_第2张图片Asp.net ModelFirst_第3张图片此时右边就会出现这些

Asp.net ModelFirst_第4张图片通过右键->新增->实体右键->新增->关联,在对应界面创建如下实体进行测试使用

结果,如下图:

Asp.net ModelFirst_第5张图片

再对应右键使用model生成数据表,只需根据它的提示新建数据库即可。

Asp.net ModelFirst_第6张图片

生成model层编码分析

通过上述操作,生成顾客表Customer 订单表OrderInfo,我们可以看到这两个表是一对多的关系,由于一个顾客可以有多个订单,所以在model的代码中,生成orderInfo导航属性是一个集合,因为使用一个顾客的Id去查询可能会返回多条数据
Asp.net ModelFirst_第7张图片

所以orderInfo中关于顾客的导航属性只用一个虚类表示,因为一个订单只能对应一个顾客

Asp.net ModelFirst_第8张图片

使用
  • 插入数据
 		Model1Container dbcontext = new Model1Container();

            #region 添加实体  向数据库插入数据
            Customer userinfo = new Customer();//声明数据库类对象
            userinfo.CusName = "User";

            dbcontext.Customer.Add(userinfo);

            Console.WriteLine("用户数据插入成功");


            OrderInfo order1 = new OrderInfo();//声明用户订单数据库对象
            order1.OrderContent = "order1";
            dbcontext.OrderInfo.Add(order1);


            OrderInfo order2 = new OrderInfo();
            order2.OrderContent = "order2";
            dbcontext.OrderInfo.Add(order2);


            //关联三个实体 通过用户添加订单到主机的导航属性
            userinfo.OrderInfo.Add(order1);
            userinfo.OrderInfo.Add(order2);


            //告诉上下文对实体做添加操作
            dbcontext.SaveChanges();
            Console.WriteLine("实体关联成功");
            #endregion
  • 更新数据
#region 修改实体

		Model1Container dbcontext = new Model1Container();//数据库对象
            Customer userInfoEdit = new Customer();
            userInfoEdit.Id = 1;
            userInfoEdit.CusName = "User001";

            //若需要使用lambda 则需要添加下文  Attach一下否则会报错
            dbcontext.Customer.Attach(userInfoEdit);
            dbcontext.Entry(userInfoEdit).Property(u => u.CusName).IsModified = true;
            // dbcontext.Entry(userInfoEdit).State = EntityState.Modified;

            dbcontext.SaveChanges();
            Console.WriteLine("实体修改成功");


            #endregion
  • 查询

    注意:下方使用的是linq表达式,and用&& 或用|| 若and多可以使用where代替让代码更简洁易懂些 具体字符串匹配等都可以使用c#提供的字符串类库

  var temp = from u in dbcontext.Customer
                       where u.Id > 2 && u.CusName == "User"
                       where u.CusName.StartsWith("U")
                       select u;


            foreach (var user in temp)
            {
                Console.WriteLine(user.CusName + "  " + user.Id);
            }
关于EF模型查询数据引发的延迟加载

1.由于只有使用的时候才去数据库取数据,所以下述遍历的时候无论如何遍历多少次每次都是用的时候再去数据库加载数据

    var temp = from u in dbcontext.Customer
                       where u.Id > 2 && u.CusName == "User"
                       where u.CusName.StartsWith("U")
                       select u;


            foreach (var user in temp)
            {
                Console.WriteLine(user.CusName + "  " + user.Id);
            }
 	foreach (var user in temp)
            {
                Console.WriteLine(user.CusName + "  " + user.Id);
            }

解决方案


 var temp = from u in dbcontext.Customer
                       where u.Id > 2 && u.CusName == "User"
                       where u.CusName.StartsWith("U")
                       select u;
                       
          

            //通过使用temp 间接遍历、查询等方式即可解决问题
            var temp2 = from u in temp
                        select u;


            Console.WriteLine("查询成功");
            #endregion
            Console.ReadLine();
  1. 导航属性 延迟加载 即该数据不属于这张表 却和这张表有关联的数据,获取该数据的流程是通过外层遍历的user信息的id去OrderInfo表遍历数据
   foreach (var user in temp)
            {
                foreach (var orderInfo in user.OrderInfo)//导航自动加载去查询 不用我们自己去加载对应数据库
                {
                    Console.WriteLine(user.CusName + " " + orderInfo.Id);
                }
            }

你可能感兴趣的:(Asp.net ModelFirst)