admin 管理员组文章数量: 1086019
2023年12月18日发(作者:c2059 语法错误)
MVC3+EF4.1学习系列(六)-----导航属性数据更新的处理
Admin
2011年8月1日 名人名言:书,这是这一代人对另一代人精神上的遗言,这是将死的老人对刚刚开始生活的青年人的忠告,这是准备去休息的哨兵对前来代替他的岗位的哨兵的命令。——赫尔岑
文章索引和简介
通过上一篇的学习 我们已经知道怎么查询关系 这篇就来说说怎么导航属性数据更新时的处理 以及EF又会为我们生成哪些SQL~
老规矩 先看下今天的图
添加和修改页面基本就是这样
这节的内容相对简单~~
主要就是讲 一对一 一对多 多对多时的增删改 以及MVC的一些小东西
一. 一对多的的处理
看第一张图 院系和课程是一对多的关系
1.添加
一对多的添加非常简单 遇到一对多的情况 我们一般考虑dropdownlist来展示 只要把这个展示出来就容易了
mvc绑定dropdownlist 一般是 控制器用 viewstate存一个SelectList 或者viewbag 然后视图绑定 上代码
课程添加控制器
public ActionResult Create()
{ PopulateDepartmentsDropDownList(); return View(); }
// // POST: /Course/Create [HttpPost] public ActionResult Create(Course course) { try { // TODO: Add
logic here if (d)
{ (course); anges();
// PopulateDepartmentsDropDownList(mentID); }
return RedirectToAction("Index"); } catch
{ elError("", "Unable to save changes. Try again, and
if the problem persists, see your system administrator."); return View(); } } ///
/// /// 选择的项 private void
PopulateDepartmentsDropDownList(object ed = null) { var
departmentsQuery = d in ments orderby
d; mentID =
new SelectList(departmentsQuery, "DepartmentID", "Name", ed); }
可以看到 非常简单下面是视图的
视图
@model @{ = "Create"; Layout =
"~/Views/Shared/_";}
Create
@using(orm()) { @tionSummary(true)
}
视图的核心其实就这句
wnList("DepartmentID","请选择")
DepartmentID 对应 你的viewbag 就能让他们对应上去了 就这么简单神奇~~ 由于生成的html name 为 DepartmentID 当你保存的时候 通过ModelBinder 会自动对应到实体类上 直接保存即可 生成的SQL插入语句也简单 而且是参数化的~
exec s p_executesql N"" [dbo].[Course]([CourseID], [Title], [Credits], [DepartmentID])values
(@0, @1, @2, @3)"",N""@0 int,@1 nvarchar(50),@2 int,@3 int"",@0=4444,@1=N""试试插入"",@2=4,@3=1
2.修改
这个没啥好说的了~~ 基本和添加一样
修改控制器
public ActionResult Edit(int id) { Course course = (id);
PopulateDepartmentsDropDownList(mentID); return View(course); } // // POST: /Course/Edit/5 [HttpPost]
public ActionResult Edit(Course course) { try
{ if (d)
{ (course).State = ed;
anges(); return RedirectToAction("Index"); } } catch (DataException)
{ //Log the error (add a variable name after DataException)
elError("", "Unable to save changes. Try again, and if the problem persists,
see your system administrator."); }
PopulateDepartmentsDropDownList(mentID); return View(course); }
生成的SQL语句如下
exec s p_executesql N"" [dbo].[Course]set [Title] = @0, [Credits] = @1, [DepartmentID] = @2where ([CourseID] = @3)"",N""@0 nvarchar(50),@1 int,@2 int,@3 int"",@0=N""试试插入"",@1=4,@2=2,@3=4444
这有个问题 就是把每个字段都做了更新 而我们实际上只更新了一个 如果能按需更新改多好 dudu给了我们好的思路 可以参考下 -----文章连接
3.删除
这个简单....没啥好说的了 具体参考第二篇 简单的增删改查~~
二.一对一和多对多
一对多比较简单 因为涉及的都是一张表里的东西 所以没什么难的 而一对一,多对多 则是处理 多张表的情况 所以这里重点说下这部分~~
先看第二个图 分析下关系 这是修改老师的信息 跟他关联的有一对一的地址 和多对多的课程 也就是说 当我们插入一条记录时
应该插入三张表 教师表 办公地址表 和 教师课程关系表 那让我们来印证下吧
1.添加
首先 我们要先把添加页面显示出来 先来说下 下面那个复选框选择课程 控制器很简单
就是读取出来所有课程存放到viewbag里即可
public ActionResult Create() { Course = (); return View(); }
视图的显示 有两种方法 一种是原文提供的
添加一个viewmodel 专门存放课程 以及是否选中 然后通过如下代码实现三列换行
原文的方法
name="edCourses" value="@ID" @((ed ? "checked="checked"" : "")) /> @ID @: @ @: | } @:
个人觉得麻烦了些 这里我说下我的方法
Builder("
name=""edCourses""/>"+list[i].Title+" | "); } ("
这里要说的就是 如果不使用这个 直接输入 则会把
好了 添加页面有了 现在就是添加了
添加
[HttpPost] public ActionResult Create(Instructor Model, string[] edCourses)
{ try { // TODO: Add logic here
if (d) { s = new
List
{
{
(item);
if
foreach (var item in ())
(ns(ng()))
} }
(Model); anges(); } return RedirectToAction("Index"); } catch
{ return View(); } }
这里提下 第二个参数 就是我们选中的checkbox 的value 的集合 这个参数的名字 与
checkbox名字的name一样
然后我们遍历所有的课程 把符合条件的加入进来 我选了一个 让我们看下EF为我们生成的SQL
exec s p_executesql N"" [dbo].[Instructor]([LastName], [FirstName], [HireDate])values (@0, @1, @2) [InstructorID] [dbo].[Instructor]where @@ROWCOUNT > 0 and [InstructorID]
= scope_identity()"",N""@0 nvarchar(50),@1 nvarchar(50),@2 datetime"",@0=N""W"",
@1=N""LF"",@2=""02 3 2011 12:00:00:000AM""exec s p_executesql N""
[dbo].[CourseInstructor]([CourseID], [InstructorID])values (@0, @1)"",N""@0 int,@1 int"",@0=2042,@1=10exec s p_executesql N"" [dbo].[OfficeAssignment]([InstructorID],
[Location])values (@0, @1)"",N""@0 int,@1 nvarchar(50)"",@0=10,@1=N""天朝""
看 确实是生成了三条SQL语句 符合我们的要求 而我们的代码 却写了很少 就轻松完成了添加~~
2.修改
修改要比添加麻烦 首先显示视图时 要显示哪些被选中了 还有就是修改时 要在关系表里删除原来的 课程教师关系 还要添加新的进去
如何让EF帮我们完成这一对一 多对多的复杂的 三张表之间的关系处理呢
还是先从视图开始 先解决让以前被选中的显示出来
public ActionResult Edit(int id) { Course =
(); Instructor model= e(i =>
s).Include(i => Assignment).Where(i => ctorID == id).SingleOrDefault(); return View(model); }
先把要修改的这条加载出来返回给视图 用贪婪加载 把地点和课程都加载出来
修改视图
Builder("
name=""edCourses""/>"+list[i].Title+" | "); } ("
在视图上加上判断 遍历到的这个课程 是否在选中的课程里 如果在 则加上选中属性
string IsSelect = ; if (ns(list[i]))
{ IsSelect = "checked=""checked"""; }
这样就解决了视图修改时的显示问题了 下面是点击修改时 让我们先大概想想 有哪些操作
1.修改 教师表信息
2.修改 地址表信息
3. 删除以前的课程关系表 和添加新的课程关系表记录
这里比较负责的是第三部 我们来想想怎么做 现在 我们能知道 我们新选择了哪些 和
以前选择了哪些 比如 新选择的是 {1,2,3} 这次选的是 {3,4,5} 那么我们应该
删除{4,5} 添加{1,2} 即可 这其实就转换为一个简单的算法题了~~ 原文给出了一种方法
我自己也写了一种 大家可以比较下看~先上原文的
原文修改核心代码
private void UpdateInstructorCourses(string[] edCourses, Instructor instructorToUpdate){ if
(edCourses == null) { s = new List
return; } var edCoursesHS = new HashSet
instructorCourses = new HashSet
ID)); foreach (var course in s) { if (ns(ng())) { if (!ns(ID)) { (course); } } else { if
(ns(ID))
{
(course); } } }}
原文利用HashSet 不能存重复项 实现 不过判断逻辑多了些 但效率应该高 hashset 散列算法
下面是我的
private void UpdateInstructorCourses(string[] edCourses, Instructor instructor)
{ if (edCourses == null) { s =
new List
string[] beforeSelect=(i => ng()).ToArray();//得到以前选择的 (edCourses).ToList().ForEach(n =>
((32(n))));
(beforeSelect).ToList().ForEach(n => ((32(n)))); }
这里 参数edCourses 为现在选中的项 利用linq 内置的方法 Except取出差集 然后
ForEach遍历移除和添加 一句话搞定 但是效率估计不会太高~~
下面是完整的修改方法
完整修改方法
[HttpPost] public ActionResult Edit(int id, FormCollection collection, string[]
edCourses) { try { // TODO: Add logic
here var instructor = e(i => s).Where(i =>
ctorID == id).SingleOrDefault(); UpdateModel(instructor, "", null,
new string[] {"Courses"}); UpdateInstructorCourses(edCourses, instructor);
if (OrWhiteSpace(on))
{ Assignment = null; }
(instructor).State = ed; anges();
return RedirectToAction("Index"); } catch
{ return View(); } } private void
UpdateInstructorCourses(string[] edCourses, Instructor instructor) { if
(edCourses == null) { s = new List
string[] beforeSelect=(i => ng()).ToArray();//得到以前选择的 (edCourses).ToList().ForEach(n =>
((32(n))));
(beforeSelect).ToList().ForEach(n => ((32(n)))); }
好了 让我们来看下执行的SQL
exec s p_executesql N"" [dbo].[Instructor]set [LastName] = @0, [FirstName] = @1, [HireDate]
= @2where ([InstructorID] = @3)"",N""@0 nvarchar(50),@1 nvarchar(50),@2 datetime,@3 int"",@0=N""W"",@1=N""LF"",@2=""02 3 2011 12:00:00:000AM"",@3=10exec s
p_executesql N"" [dbo].[OfficeAssignment]set [Location] = @0where ([InstructorID] = @1)"",N""@0 nvarchar(50),@1 int"",@0=N""超"",@1=10exec s p_executesql N""
[dbo].[CourseInstructor]where (([CourseID] = @0) and ([InstructorID] = @1))"",N""@0 int,@1 int"",@0=2042,@1=10exec s p_executesql N"" [dbo].[CourseInstructor]([CourseID],
[InstructorID])values (@0, @1)"",N""@0 int,@1 int"",@0=0,@1=10
看 和我们想要的效果一样~~
3.删除
简单的说下删除, 当我们删除一条数据时 直接看生成的SQL语句 预计应该是 要删3个
表
exec s p_executesql N"" [dbo].[CourseInstructor]([CourseID], [InstructorID])values (@0,
@1)"",N""@0 int,@1 int"",@0=0,@1=10exec s p_executesql N""
[dbo].[OfficeAssignment]where ([InstructorID] = @0)"",N""@0 int"",@0=10
结果是删除了 2个表的 一对一的删除了 可是多对多的为什么没删除 这其实是一个简单的数据库知识了~~
EF为我们创建数据库时 这个删除规则是层叠 就是级联删除 所以这个关系表的就会被直接删除了
三.总结
导航属性的更新操作等 结束了 现在EF的已经基本操作已经结束了 下一节讲EF处理并发的策略
版权声明:本文标题:MVC3+EF4.1学习系列(六)---导航属性数据更新的处理 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1702869143a433933.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
更多相关文章
Focal 3-way In-wall 音响说明书
年月日发(作者:编程培训课程哪个产品好)"(.).,..-.(-,,)-(-,,).,.-.,."().,."..,.""()..•--••(,)•-•••--•(.)(-)(-)()-()()()()--"(.),"(),"()-.-""
手机输入法iPhone版安装教程
年月日发(作者:)百度手机输入法版本安装教程准备工作:.准备一台已越狱的.以上的设备(、、)。如何越狱点此查看教程.确保手机当前可以联网添加百度官方源.同步安装请保持手机和电脑连接状态。安装方法,详见下文开始安装:方法一、源安装(推荐)常见
vue3 readonly 的使用场景
年月日发(作者:计算机程序设计语言有哪三种)的使用场景【最新版】目录的属性是什么属性的使用场景.如何使用属性.使用属性的好处正文一、的属性是什么在中,属性可以用于组件的或者中,它表示这个属性是不可修改的。这意味着当我们试图修改这个属性时,会
快速删除几百个文件的方法
年月日发(作者:是软件自带的吗)在处理大量文件时,快速删除几百个文件的方法取决于你使用的操作系统。以下是在常见操作系统(、、)上快速删除多个文件的一些建议:在上:.使用命令行:在命令提示符或中使用以下命令:":路径*.*":安静模式,不会提
linux下删除文件前100行的命令
年月日发(作者:的中文)下删除文件前行的命令操作系统是一个开源的操作系统,被广泛运用于服务器领域。在使用系统时,经常需要对文件进行操作。其中,删除文件是常见的操作之一。本文将介绍如何在系统下使用命令删除文件的前行。在系统中,我们可以使用命令
windowscmd命令行下创建删除文件和文件夹
年月日发(作者:)命令行下创建删除文件和文件夹在下我们往往通过‘右键新建’命令来创建文件和文件夹,但有时会遇到以点开头的文件。下面是店铺跟大家分享的是在使用命令删除文件,欢迎大家来阅读学习。在使用命令删除文件工具原料电脑系统创建删除文件夹键
批处理修改删除文件内容
年月日发(作者:原码反码和补码原理)批处理修改删除文件内容可以使用批处理命令来修改和删除文件内容。下面是一些常用的批处理命令:.使用命令添加文本到文件中:这将在文件末尾添加""。.使用命令覆盖文件内容:这将覆盖文件内容并只保留""。.使用和
linux的删除命令
年月日发(作者:按列提取文本数据)的删除命令系统下我们经常使用到删除操作,那么它是由哪个命令发起的呢?面由店铺为大家整理了的删除命令的相关知识,希望对大家有帮助!的删除命令详解是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录
linux系统中删除时间段的文件命令
年月日发(作者:教程入门)系统中删除时间段的文件命令在系统中,你可以使用命令结合-或-选项来查找并删除特定时间段的文件。以下是一些示例命令:.删除天之前的文件:---这里,是要搜索的目录路径,-表示只查找普通文件,-表示查找修改时间在天之前
vb cmd中删除文件的命令
年月日发(作者:文件删除了怎么恢复)中删除文件的命令在中删除文件的命令是“”命令。在中使用此命令可以方便地将不再需要的文件从计算机中删除。语法格式如下:[:][][]可以在任何驱动器和路径中删除指定的文件。[]参数询问用户确认删除之前是否在
windows bat 遍历path删除路径 -回复
年月日发(作者:标签什么意思)遍历删除路径-回复中的.文件是一种批处理文件,用于通过命令行自动执行一系列的操作。在本篇文章中,我们将学习如何编写一个遍历并删除指定路径的.文件。在操作系统中,是一个环境变量,用于指定可执行文件的路径。通过将可
程序设计c语言课程设计
年月日发(作者:颜色代码常用)程序设计语言课程设计一、教学目标本课程的教学目标是使学生掌握语言程序设计的基本概念、语法和编程技巧,培养学生运用语言解决实际问题的能力。具体分解为以下三个方面的目标:.知识目标:学生需要掌握语言的基本语法、数据
论“不是……而是……”和“不是……就是……”的异同
年月日发(作者:影响因子)精品文档(可编辑)值得下载论“不是……而是……”和“不是……就是……”的异同摘要:本文通过对语表、语义、语用三方面的深度解析,旨在分析同类关系联词“不是……而是……”和“不是……就是……”的异同,并试图探讨造成二者
Access选择题(2021版摘自虎贲教育)
年月日发(作者:工作流是什么)选择题(版摘自虎贲教育)考点:软件工程基础()结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限制使用语句对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好继承是面向对象的方法的一个
c语言程序设计课程设计要求
年月日发(作者:)语言程序设计课程设计要求一、课程目标知识目标:.理解语言程序设计的基本概念,掌握数据类型、变量、运算符和表达式的使用;.学会使用顺序结构、分支结构和循环结构进行程序设计;.掌握数组和函数的基本运用,能够进行简单的模块化编程
职业大学大学生计算机信息技术试卷5与答案
年月日发(作者:语言写协议通讯)百度文库-让每个人平等地提升自我职业大学《大学生计算机信息技术》试卷与答案班级________姓名_________学号______成绩________一、判断题(*分)[].编译程序是一种把高级语言程序翻译
《Linux系统管理与应用》课程知识点整理+书后习题全文解答(Linux知识点大纲)
目录 第一章:Linux操作系统概述 知识点整理部分 课后习题与参考答案 第二章:Linux系统的环境搭建 知识点整理部分 课后习题与参考答案 第三章:Linu
qq群关系数据库 mysql,腾讯QQ用户群关系数据库泄露下载地址 (附解压密码)
11月18日消息,据国内安全问题反馈平台乌云爆料,腾讯QQ存在重大安全隐患,致使QQ群关系数据泄露。目前,消息称迅雷快传上已经出现大量QQ群关系数据包的
【数据库课程设计】SQLServer数据库课程设计(学生宿舍管理),课设报告+源码+数据库关系图
数据库课程设计——学生宿舍管理,需要全部源码可以关注私信我,把邮箱发在评论区 前言一、课题背景和开发环境1、课题背景2、开发环境 二、系统功能及示意图1、系统实现功能2、功能示意图2.1学生模块2
《现代操作系统:原理与实现》chcore 课程实验 陈海波 2021-10-26
一 ChCore课程实验代码及说明 附件为ChCore课程实验的代码及说明,请首先阅读压缩包内的chcore-git.md。 https:wwwmoocstudyunit522947.mooc 实验代码&a
推荐文章
jquery - Javascript: How to detect if the current page has a form with particular name and input - Stack Overflow
JavaScript onclick() event bubbling - working or not? - Stack Overflow
javascript - jTable Conditional showhide edit and delete buttons based on owner of data - Stack Overflow
javascript - Why does ~-1 equal 0 and ~1 equal -2? - Stack Overflow
Javascript - Passing function as string, then execute if it exists - Stack Overflow
热门文章
最新文章
-
windows配置开机自启动软件或脚本
24天前
发表评论