博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADO.NET Entities Framework 的增删查改
阅读量:4509 次
发布时间:2019-06-08

本文共 6126 字,大约阅读时间需要 20 分钟。

数据库中有如下两张表,一个文章分类表(ArtCategory),一个文章表(Articles),它们之间的关系是一对多。其中,ArtCategory中的主键AC_Id是自动增长字段。

操作一:添加文章到数据库

/// /// 添加文章 /// ///提交的Form   [AcceptVerbs(HttpVerbs.Post)]  [ValidateInput(false)]  [ValidateUserLogin(Order = )]  [MyAuthorityValidation(Order = )] public ActionResult Add(FormCollection form)   {   Blog.Models.Articles article =null;  if (form !=null)   {  if (Blog.Utility.Article.Token == )   {  #region 验证用户输入  if (form["txtTitle"].IsNullOrEmpty())   {   ViewData["Message"] = JSUtility.GetScript("$.MsgBox(\"请输入文章标题!\");");  return View();   }  if (form["ddlCat"].IsNullOrEmpty())   {   ViewData["Message"] = JSUtility.GetScript("$.MsgBox(\"文章类别有误!\");");  return View();   }  if (Suxibo.Convert.ToInt  (form["ddlCat"]) ==- )   {   ViewData["Message"] = JSUtility.GetScript("$.MsgBox(\"请选择文章类别!\");");  return View();   }  if (form["editor "].IsNullOrEmpty())   {   ViewData["Message"] = JSUtility.GetScript("$.MsgBox(\"请输入文章内容!\");");  return View();   }  #endregion  int userId = ((Blog.Models.UserInfo)Session["UserInfo"]).Usr_Id;  try   {  #region ==发布文章==  using (Blog.Models.BlogDb db =new Models.BlogDb())   {   DateTime datetime = DateTime.Now;  //初始化一个文章实体对象    article =new Models.Articles();  //将当前时间转换成指定的格式并作为文章编号    article.Art_Id = datetime.ToString("yyyyMMddHHmmss");  #region 设置类别  //获取用户选择的文章类别编号   int AC_Id = Suxibo.Convert.ToInt  (form["ddlCat"]).GetValueOrDefault();  //根据用户选择的文章类别编号获取对应的文章类别实体    var selectedCat = db.ArtCategory.FirstOrDefault(x => x.AC_Id == AC_Id);  //将当前文章实体的类别指向上面选定的文章类别实体   article.ArtCategoryReference.Value = selectedCat;  #endregion  //设置文章标题   article.Art_Title = form["txtTitle"].HtmlEncode();  //设置文章发布时间   article.Art_PostTime = datetime;  //设置文章是否置顶   article.Art_IsTopest = form["chkTopest"] =="on"?true : false;  //设置文章内容   article.Art_Content = form["editor "].HtmlDecode().HtmlEncode();  #region 设置用户  //根据登录用户的编号获取用户实体   var selectedUser = db.UserInfo.FirstOrDefault(x => x.Usr_Id == userId);  //将当前文章实体对应的用户实体指向上面选定的用户实体   article.UserInfoReference.Value = selectedUser;  #endregion  //设置文章的标签   article.Art_Tag = form["txtTag"].HtmlEncode();    if (article.Art_IsTopest.Value)   {   article.Art_TopTime = datetime;   }  //添加当前文章实体到数据库   db.AddToArticles(article);  bool rs = db.SaveChanges() > ;  if (rs)   {  string artUrl ="/Archives/Details/".ToAbsoluteUrl() + article.Art_Id;  string dirUrl = ("~/Archives/"+ datetime.Year +"/"+ datetime.Month +"/");  string fileName = article.Art_Id +".html";   UriBuilder ub =new UriBuilder(artUrl);   Utility.Article.MakeStaticHtmlPage(ub.Uri, dirUrl, fileName);  return RedirectToAction("SkipPrompt", new { success =true, returnMessage ="发布成功!", returnUrl = dirUrl.ToUrl() + fileName });   }  else   {  return RedirectToAction("SkipPrompt", new { success =false, returnMessage ="发布失败!" });   }   }  #endregion   }  catch (Exception ex)   {  return RedirectToAction("SkipPrompt", new { success =false, returnMessage ="发布失败!原因:"+ ex.Message });    }   finally    {    Blog.Utility.Article.Token++;    }    }   else    {    ViewData["Message"] = JSUtility.GetScript("$.MsgBox(\"不可重复提交!\");");    }    }   return View();    }

  

 

说明:在指定与文章实体关联的文章类别实体时,不可用这种方式去设置:article.ArtCategory.AC_Id = AC_Id;  即不可通过给文章实体的关联实体ArtCategory的AC_Id赋值去实现。原因:其一,由于未调用文章实体的关联属性的Load方法,即 article.ArtCategoryReference.Load();  ,所以 article.ArtCategory 值为null,此时引用它必定报错。其二,即使调用了前面的Load()方法,则程序依然报错,因为article的关联实体ArtCategory的主键值是AC_Id,它是自动增长字段,是不允许被修改的!所以必须通过更改文章实体对文章类别实体的引用才可以执行通过。

 

操作二:更新文章

说明:更新操作与添加操作的思路是一模一样的,对于文章实体的关联实体的修改同样是通过更改对关联实体的引用实现的。而对于文章实体本身的属性,则直接赋予修改后的值即可。

操作三:删除文章

/// /// 删除文章 /// ///文章编号  [ValidateUserLogin(Order = )]  [MyAuthorityValidation(Order = )] public ContentResult Delete(string Id)  { if (Request.IsAjaxRequestx())   {  string contentType ="text/plain";  if (Permission.IsTimeOut())  return Content("您已登录超时,请重新登录后再操作!", contentType);  if (Id.IsNullOrEmpty())   {  return Content("不存在指定编号的文章!", contentType);   }  if (!Id.IsNumber())   {  return Content("请求的文章编号错误!", contentType);   }  using (System.Transactions.TransactionScope trans =new TransactionScope())   {  using (Blog.Models.BlogDb db =new Models.BlogDb())   {   var sla = db.Articles.FirstOrDefault(x => x.Art_Id == Id);  if (sla.Comment !=null&&!sla.Comment.IsLoaded)   sla.Comment.Load();  while (sla.Comment.Count > )   {   var co = sla.Comment.FirstOrDefault();  if (co !=null)   {  if (co.AdminReply !=null&&!co.AdminReply.IsLoaded)   co.AdminReply.Load();  while (co.AdminReply.Count > )   {   db.DeleteObject(co.AdminReply.FirstOrDefault());   }   db.DeleteObject(co);   }   }   db.DeleteObject(sla);  int rs = db.SaveChanges();   trans.Complete();  if (rs > )   {   Article.DeleteStaticHtmlPageFile(Id);  return Content(" ", contentType);   }   }   }  return Content("删除失败!", contentType);   }  return Content("服务器拒绝请求!");   }

  

 

 

注意:对于删除实体操作,不可用foreach来进行循环遍历,因为foreach是只读的,对集合里面的元素进行删除会造成foreach操作抛出异常,切记!

 

操作四:查询文章列表

/// /// 获取指定范围的文章 /// ///起始索引 ///记录的个数 ///地址 ///文章类别编号 public PageOfList
GetArticlesList(int pageIndex, int pageSize, string url, string catId) { using(BlogDb Db =new BlogDb()) { var src = Db.Articles .OrderByDescending(x => x.Art_IsTopest) .ThenByDescending(x => x.Art_PostTime) .ThenByDescending(x => x.Art_TopTime) .ToList(); if (src !=null) { foreach (var s in src) { if (s !=null) { if (s.UserInfoReference !=null&&!s.UserInfoReference.IsLoaded) s.UserInfoReference.Load(); if (s.ArtCategoryReference !=null&&!s.ArtCategoryReference.IsLoaded) s.ArtCategoryReference.Load(); if (s.ArtCategoryReference !=null&&!s.Comment.IsLoaded) s.Comment.Load(); } } } /**

  

说明:在上述查询中,我需要获取文章实体的关联实体ArtCategory的属性AC_Id的值,这时需要注意的是,如果在这之前没加载关联实体ArtCategory,那么这个操作将不会被编译通过,原因在操作一中已经解释了。其次,还要注意一点很重要的,就是在写Linq to sql 或者 Entity Sql语句时,一定要搞清哪些方法是可以在linq to sql中执行的,

哪些方法是只能在linq to object中执行的。比方说上面代码中的这一句:var rs = src.Where(x => x.ArtCategory.AC_Id.ToString() == catId);我为什么可以用.ToString()方法?因为我在前面已经把src给ToList()了,如果没有把src给ToList(),那么.ToString()方法将不能用于这里,因为.ToString()是linq to object里面的方法,而不是linq to sql里面的方法!切记!

 

 

转载于:https://www.cnblogs.com/BuBu/archive/2012/08/19/2646483.html

你可能感兴趣的文章
2014暑期最后一次个人赛
查看>>
●洛谷P1291 [SHOI2002]百事世界杯之旅
查看>>
软工网络15团队作业2——团队计划
查看>>
MySQL--创建用户
查看>>
isIos
查看>>
js+canvas实现滑动拼图验证码功能
查看>>
华为ensp工具栏丢失解决方法
查看>>
静态网页中的使得文字向上一直滚动,中间不间断。
查看>>
MySQL常见错误代码说明
查看>>
innobackupex 相关语法讲解【转】
查看>>
pt-table-sync同步报错Called not_in_left in state 0 at /usr/bin/pt-table-sync line 5231【原创】...
查看>>
jooq使用示例
查看>>
属性参数
查看>>
AQS独占式同步队列入队与出队
查看>>
修改原代码定制bootstrap
查看>>
idea快捷键
查看>>
shell——bash在线编辑
查看>>
Kth Smallest Element in a BST
查看>>
iOS开发从新手到App Store上架
查看>>
poj--2516--Minimum Cost(最小费用流)
查看>>