EF 4.1+MVC3+Jquery Ajax+Json.Net+JqueryUI+IUnitOfWork+Repository 学习DEMO(暂停更新)-阿里云开发者社区

开发者社区> 范大脚脚> 正文

EF 4.1+MVC3+Jquery Ajax+Json.Net+JqueryUI+IUnitOfWork+Repository 学习DEMO(暂停更新)

简介:
+关注继续查看

学习项目进行中,持续更新。

SyntaxHighlighter貌似在2011wlw里报错,无法着色。

EF记得在我搞Linq2Sql不久就放出声音出来了,说有多么多么好。

记得早先版本里尝鲜的时候我一看到那坨xml就恶心,也就没心情接着玩了。

没办法Linq2Sql里的xml就被它搞的死去活来,哎,过渡产品哭泣的脸

本来想凭着Linq2Sql的经验不看介绍直接玩,完了,托大了,几个小时一直返回“no ProviderManifestToken  string …”

好吧,认真看ADO TEAM BLOG的文章,太不负责任了,说详细点会死啊,“痛苦并快乐着”。

接着看看ScottGu,还是老大负责,烧香,行礼~

EF版本更新也太快了,不过真的是越来越方便了,要跟上时代。

毫不犹豫地选择Code-Fist 方向,一路凯歌前进。

先贴上Entity 代码:


  1:     [DataContract]
  2:     public class BlogArticle
  3:     {
  4:         [Key]
  5:         [Required]
  6:         [DataMember]
  7:         public int BlogAritcleID { get; set; }
  8: 
  9:         [Required(ErrorMessage="博客标题不可以为空!")]
 10:         [StringLength (256,ErrorMessage="博客标题最长不超过256个字符。")]
 11:         [DataMember]
 12:         public string Title { get; set; }
 13: 
 14:         [Required(ErrorMessage="博客文章不可以为空!")]
 15:         [StringLength(25600,ErrorMessage="博客标题最长不超过25600个字符。")]
 16:         [DataMember]
 17:         public string Article { get; set; }
 18: 
 19:         [Required]
 20:         [DataMember]
 21:         public int BlogCategoryID { get; set; }
 22: 
 23:         [Required]
 24:         [DataMember]
 25:         public DateTime PublishDate { get; set; }
 26: 
 27:         [Required]
 28:         [DataMember]
 29:         public DateTime UpdateDate { get; set; }
 30: 
 31:        
 32:         public virtual BlogCategory BlogCategory { get; set; }
 33:     }
 34:     [DataContract]
 35:     public class BlogCategory
 36:     {
 37:         [Key]
 38:         [Required]
 39:         [DataMember]
 40:         public virtual int BlogCategoryID { get; set; }
 41:         
 42:         [Required]
 43:         [DataMember]
 44:         public virtual string Name { get; set; }
 45: 
 46:         [JsonIgnore]
 47:         public virtual ICollection<BlogArticle> BlogArticles { get; set; }
 48:     }

32,47两行代码使得DBContext可以对这两个表建立外键关系,神之笔啊,同理多对多也差不多。

上面DATAMEMBER等特性是Json.Net需求的,如果没有声明会在json序列化的时候报错,其中就有“RenlationshipManage”JN无法继续序列化,会引发自引用。所以这里必须用排他法标注。

接着DBContext,这个东西让我想起了Linq to sql,当时是这么个Context,看起来倍感亲切。

这个玩意儿神奇,EF就是靠它找到那些entity,烧香,行礼。

哪位老大能告诉我下面Seed里为什么数据总是添加进不去?:


  1:    public class BlogContext:DbContext
  2:     {
  3:         public DbSet<BlogArticle> BlogArticles { get; set; }
  4:         public DbSet<BlogCategory> BlogCategories { get; set; }
  5: 
  6:         public BlogContext()
  7:         { }
  8:         public BlogContext(string cnn)
  9:             : base(cnn)
 10:         { }
 11: 
 12:         protected override void OnModelCreating(DbModelBuilder modelBuilder)
 13:         {
 14:             
 15:             base.OnModelCreating(modelBuilder);
 16:         }
 17: 
 18:         public static void AddSeedData(BlogContext c)

这里DBSET<T>告诉DBContext哪些是要map进数据库的实体~进过这里的实体类型也会被动改变,因为他们即将拥有关系。

Application_Start


  1: protected void Application_Start()
  2:         {
  3:             AreaRegistration.RegisterAllAreas();
  4: 
  5:             RegisterGlobalFilters(GlobalFilters.Filters);
  6:             RegisterRoutes(RouteTable.Routes);
  7: 
  8:             Database.SetInitializer<BlogContext>(new DropCreateDatabaseIfModelChanges<BlogContext>());
  9:         }

第一次运行会创建相应的数据库,可以指定config中的连接字符串。

虽然没有在项目中创建EDM,实际上是放在自动创建的库中了。

然后就是做出以下两个界面以及引进JqueryUI

Article

Home

head

第一次用JqueryUI,太TMD爽了,哇哈哈~~

AJAX

客户端“删除”链接:


  1: <a href="javascript:" onclick="ajaxPost('./Article/Delete?id=@item.BlogAritcleID')">Delete</a>
客户端“删除”请求:

  1: <script  language ="javascript" type="text/javascript" >
  2:     function ajaxPost(urlStr) {
  3:         $.ajax({
  4:             url: urlStr,
  5:             beforeSend: function () { ShowMessage("正在提交,请等待!"); },
  6:             success: function (data) { ShowMessage(data); setTimeout(refreshPage, 800); },
  7:             error: function (data) { ShowMessage(data); }
  8:         });
  9:     }
 10: 
 11:     
 12: </script>

2011WLW一个劲当掉,晕~~

客户端“添加”以及“编辑”请求(以BlogArticleID是否<0来区分):


  1:         $.ajax({
  2:                 type: "POST",
  3:                 contentType:"application/json",
  4:                 url:"Do",
  5:                 data:articleStr, 
  6:                 dataType:'json',
  7:                 processData:true,
  8:                 beforeSend: function () {
  9:                     ShowMessage("正在提交");
 10:                     },
 11:                 success:function(data){ 
 12:                     ShowMessage(data.Message);
 13:                     setTimeout(toHomePage,1000);
 14:                     },
 15:                 error:function() { 
 16:                     ShowMessage("Your request is failed, pls check your internet and try again later!"); 
 17:                     }
 18:             });

这里用json来交互,json一直只闻其名,一直以为挺麻烦的东西没想到用起来挺顺的。

对了,谁能告诉我为什么Jquery在ajax提交的时候,datatype不是string的全要process成querystring啊?

json对象与json string的转换 articleStr=JSON.stringify(article);

服务端:


  1:         [HttpPost]
  2:         public ActionResult Do()
  3:         {
  4:             var entityStr=string.Empty;
  5: 
  6:             //read json entity from post request
  7:             using (System.IO.StreamReader reader = new System.IO.StreamReader(Request.InputStream))
  8:             {
  9:                 entityStr = reader.ReadToEnd();
 10: 
 11:                 //jquery ajax process the data by utf-8, need to convert back
 12:                 entityStr = HttpUtility.UrlDecode(entityStr);
 13:             }
 14: 
 15:             //try convert to entity back
 16:             BlogArticle article=null;
 17:             ResponseState rs = new ResponseState();
 18:             try
 19:             {
 20:                 
 21:                 article = JsonConvert.DeserializeObject<BlogArticle>(
 22:                 entityStr
 23:                 , new Newtonsoft.Json.Converters.IsoDateTimeConverter())//keep the date formate same as new date in javascript
 24:                 as BlogArticle;
 25: 
 26:                 if (article.BlogAritcleID < 0)
 27:                     blogContext.BlogArticles.Add(article);
 28:                 else
 29:                 {
 30:                     blogContext.BlogArticles.Attach(article);
 31:                     var stateEntry = ((IObjectContextAdapter)blogContext)
 32:                         .ObjectContext
 33:                         .ObjectStateManager
 34:                         .GetObjectStateEntry(article);
 35:                     stateEntry.SetModifiedProperty("Title");
 36:                     stateEntry.SetModifiedProperty("Article");
 37:                     stateEntry.SetModifiedProperty("BlogCategoryID");
 38:                     stateEntry.SetModifiedProperty("UpdateDate");
 39:                 }
 40: 
 41:                 blogContext.SaveChanges();
 42: 
 43:                 rs.isSuccess = true;
 44:                 rs.Message = "Submit Success!";
 45:             }
 46:             catch (Exception exc)
 47:             {
 48:                 rs.isSuccess = false;
 49:                 rs.Message = exc.Message;
 50:                 //rs.Message = "For some reason ,your article refused! Pls check and submit again!";
 51:             }
 52:             finally
 53:             {
 54:                 System.Threading.Thread.Sleep(800);//wait to show ajax effect
 55:                 Response.Clear();
 56:                 Response.Write(JsonConvert.SerializeObject(rs));//response the result
 57:                 Response.ContentType = "application/json";
 58:                 Response.End();
 59:             }
 60: 
 61:             return new EmptyResult();//no view need
 62:         }

对于上面更新实体部分请参考dudu文章

-----------------V1 部分结束-------------------------

加个进度条

process

简单做个检查防止提交频率过快


  1:         public static bool SubmitFreCheck()
  2:         {
  3:             if (CurrentContext().Session[lastSubmitTime] is DateTime)
  4:             {
  5:                 var date = (DateTime) CurrentContext().Session[lastSubmitTime];
  6:                 if (date.AddSeconds(3) > DateTime.Now)
  7:                     return true;
  8:             }
  9:                 return false;
 10:         }
 11: 
 12:         public static void SetLastSubmitDate()
 13:         {
 14:             CurrentContext().Session[lastSubmitTime] = DateTime.Now;
 15:         }

这个很粗糙,请绕过。。。。
 
IUnitOfWork+Repository
class view
 
现在代码总算是有点样子了
ajax列表吧
客户端:

  1:     function getPageNoprocess(size,pageIndex) {
  2:         $.ajax({
  3:             type: "get",
  4:             url: './Article/GetArticlesByPage?size=' + size + '&pageIndex=' + pageIndex,
  5:             dataType: "html",
  6:             beforeSend: function () {
  7:                 CurrentIndex = pageIndex;
  8:             },
  9:             success: function (data) {
 10:                 $('#ArticleTable tr[class="data"]').remove();
 11:                 $('#ArticleTable').append(data);
 12:                 getPagerLinks(size, pageIndex);
 13:             }
 14:         });
 15:     }

服务端:


  1:         [HttpGet]
  2:         public ActionResult GetArticlesByPage(int? size ,int? pageIndex)
  3:         {
  4:             if (size == null || size < 1)
  5:                 size = 5;
  6: 
  7:             if (pageIndex == null || pageIndex < 1)
  8:                 pageIndex = 1;
  9: 
 10:             System.Threading.Thread.Sleep(500);
 11: 
 12:             try
 13:             {
 14:                 IArticleRepository ar = new ArticleRepository(iUnitOfWork);
 15: 
 16:                 var eList = ar.GetEntityCollecionByPage((int)size, (int)pageIndex);
 17: 
 18:                 string repStr = string.Empty;
 19:                 StringBuilder sb = new StringBuilder();
 20:                 if(eList !=null )
 21:                     foreach (var e in eList)
 22:                     {
 23:                         #region table tr build up
 24:                          。。。
 25:                         #endregion
 26:                     }
 27:                 Response.Clear();
 28:                 Response.Write(sb.ToString());
 29:                 Response.Flush();
 30:             }
 31:             catch (Exception exc)
 32:             {
 33:             }
 34: 
 35:             return new EmptyResult();
 36:         }

有列表没分页不行,来一个:

first

middle

last

眼熟?


本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2011/04/07/2008858.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[unity3d]手游资源热更新策略探讨
上一次我们学习了如何将资源进行打包。这次就可以用上场了,我们来探讨一下手游资源的增量更新策略。注意哦,只是资源哦。关于代码的更新,我们稍后再来研究。理论上这个方案可以使用各种静态资源的更新,不仅仅是assetbundle打包的。
885 0
JAVA多线程高并发学习笔记(三)——Callable、Future和FutureTask
为什么要是用Callable和Future Runnable的局限性 Executor采用Runnable作为基本的表达形式,虽然Runnable的run方法能够写入日志,写入文件,写入数据库等操作,但是它不能返回一个值,或者抛出一个受检查的异常,有些需要返回值的需求就不能满足了。
1330 0
阿里推出业界首个非侵入式热修复方案Sophix,颠覆移动端传统发版更新流程!
阿里巴巴对Android热修复技术已经进行了长达多年的探索。 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dexposed。
3711 0
Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
原文:Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中] 前言 本来一直参见于微软官网进行学习的, 官网网址http://www.asp.net/web-api。出于自己想锻炼一下学习阅读英文文章的目的,又可以学习下微软新发布的技术,其实也很久了,但自己菜鸟一枚,对自己来说都是新技术了。
1349 0
一些非常有用的html,css,javascript代码片段(持久更新)
1.判断设备是否联网 if (navigator.onLine) { //some code }else{ //others code }  2.获取url的指定参数 function getString(parameter) { var url = window.
796 0
基于多任务学习和负反馈的深度召回模型
召回结果的好坏对整个推荐结果有着至关重要的影响,最近的一系列实践和研究表明,基于行为序列的深度学习推荐模型搭配高性能的近似检索算法可以实现既准又快的召回性能;与此同时,用户在天猫精灵上还可以进行实时指令操控(歌名点播:“播放七里香”、风格流派推荐点播:“来点摇滚”、主动切歌:“下一首”等),如何利用这些丰富的反馈信息改进召回模型的性能,他们是怎么做的呢?
1175 0
Java学习--Ajax与数据库连接池
Java学习--Ajax与数据库连接池 概述 数据库连接池 Ajax简介 JavaScript实现Ajax jQuery实现Ajax 一:数据库连接池 数据库连接是一种关键的有限的昂贵的资源,对数据库连接的管理能显著影响到整个应用程序的性能。
1599 0
+关注
3656
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载