.NET WebApi 实战第四讲之EF进行数据库的写操作

        休息了两天,停止了笔耕,人老了,上了年龄了,就变懒了。今天勉强强迫自己继续实战的演练,本节我们就接着上一节,继续进行接口的实战及数据库方面的技能点。

        上一节,我们主要是从数据库进行读数据,但是实际的业务场景中,需要前端(或管理后台)调用接口,向数据库先产生数据,即插入数据,后面的业务根据这些数据产生更多的业务。所以,本节,我们就来讲讲向数据库插入数据操作。

插入数据前,我们的csdnUser表中有一个字段:id varchar(20),数据库中每一条数据都有自己的id,并且必须是唯一的。注意这个唯一,指的是本表唯一。不同表中的ID有可能会出现重复,这完全是合理的,只要保证同一个表的主键id唯一即可。

那么向数据库插入数据,就免不了给对应的EF实体ID赋值,我们如何保证ID的唯一呢?C#中本身就提供一个类:Guid:

我们可以通过调用Guid.NewGuid().ToString();方法来生成唯一的ID。回头来看看我的数据库设计时,设计的ID的长度仅仅为20位,但是些方法生成的是32位,是保存不进去的,长度超出了。那么怎么办?

1、要么截短

2、要么把数据库的设计长度调整为32位

这里我们选择第2条,保证生成的数据的唯一性,截断,并不能保证数据的唯一性了,失去了本类实现存在的价值了。如下修改为32位长度,保存表。

 下面我们来编写新的方法,通过接口调用,向数据库中写入数据。向UserController类里面实现以下方法:

然后我们运行项目:

这是什么鬼?为什么返回了上面Get方法接口的内容?可是你明明请求的是addNewUser方法!这是什么原因呢?

这里是因为,一个API 控制器中只能有一个GET、POST、PUT、DELETE方法!如果明显标注,则都默认是GET方法!这里的标注指的是:[HttpGet]、[HttpPost]指令!

即:https://localhost:44309/api/user/xxx,后面无论写的是什么方法,都会最终执行的是GET方法,根本不会执行你写的方法。当然如果你可去重新写GET方法,因为另写方法,会让代码更优雅,更有逼格!现在我们调整我们的代码如下,以进一步理解这些[HttpGet]、[HttpPost]指令究竟是什么东西,我们将再加一个方法名为getAllUsers,然后运行代码:

 我们看到了如下错误:

{"Message":"出现错误。","ExceptionMessage":"找到了与该请求匹配的多个操作: \r\n类型 WebApplication.Controllers.UserController 的 Get\r\n类型 WebApplication.Controllers.UserController 的 getAllUsers","ExceptionType":"System.InvalidOperationException","StackTrace":"  在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n  在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n  在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n  在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__15.MoveNext()"}

它的意思就是说,在你这个控制中存在两个Get方法,不知道执行哪一个了,那就异常了!注意这里所谓的两个GET方法,是指方法的HTTP指令一样[HttpGet]、输入参数一样!而不是说方法名一样![HttpGet]默认是省略的!所以,我们这里确实存在两个GET方法,默认模板生成的Get方法及我们自己实现的一个GET方法!在实际开发中,我们更倾向于使用后面这个GET方法,从语义上更好理解及阅读,所以,我们删除掉第一个GET方法即可:以下两种调用方式均正确的返回了我们期待的数据。但是实际开发中,我们不建议你使用第一种方法调用,这样的方法调用太隐晦!懂的人知道,这是在调用UserController的get方法或者是在调用UserController被标记为[HttpGet]的方法!不懂的人,根本不知道这是个什么鬼!

故而,强烈建议我们通过第二种方式来调用,显而易见!后期维护也很方便。

我们顺便调用一下我们的另一个方法看看:

 你看,它还是走了上面的GET方法。因为你这样调用,既没有变量的输入,.NET API仍然是去找此类里面的GET方法去执行!

在进行复杂的HTTP参数实战之前,我建议我们还是将addNewUser改造的简单点,让你看的懂,更容易理解。我们将其改造为如下格式:输入 一个用户名、一个手机号,然后生成一个用户,保存到数据库中。如下所示:

修改我们的URL为:

https://localhost:44309/api/user/addNewUser?name=xx&mobile=13288889999

可以看到,有对应的参数及值!我们看看执行的结果是什么:

咦?又异常了!这个学习起来何等艰难。。各种异常。。头疼不?没事,正是因为有这些异常,才会让你提升技能,才会让你于实战中补强自己!

我们如上,依次展开异常信息,仔细分析问题,不要脑仁轰轰的傻掉就行。我们看到,我们定义的ID长度是32位的,但你数数你的长度是多少?所以,问题就一目了然了,我们只需要调整我的数据即可,长度必须小于等于设计的长度,超出就不行了。如下,我们调整生成ID的格式,这个格式,同学们可以自己搜索,记住即可。

 然后再运行起来,还是在报错!。。。。这。。。。。到底。。。。是怎么了。。。。

不慌,莫慌。。。莫慌。。我们想想是哪里出了问题。我们修改了数据库字段的长度,怎么没有重新生成EF呢?敲脑袋,这是知识点,记住!!

同时对DataProvider再生成一次!任何数据库的修改,对应的数据EF数据模式都必须重新生成!同学们,重点记住。

我们现在再来运行起来,看看数据的插入:

经过我们不懈的努力,代码终于运行正常!来来,我们去查一下数据库,看看数据。

现在回过头来看看,体验一下:

你有没有发现,你全部并没有在代码中书写什么insert into数据库语句!这就是EF的便利之处!它就是你的数据模型与数据为之间的桥梁,只需要开发者将重心关注在逻辑层,一心一意的去写逻辑。数据库的操作尽量交给EF去做。

好了,本节教程就到这里,教程过程中所出现的错及重点信息,希望同学们牢记!

下一讲: .NET WebApi 实战第五讲之EntityFramework事务

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容