《赤裸裸的统计学》阅读笔记整理

《赤裸裸的统计学》这本书不错,很直观的说明了一些统计学相关术语比如:正态分布,平均值,中位数,方差,标准差等等。

百分比:

问题一:一台电脑售价4999元,先降价25%在涨价25%那他现在售价多少?

答案是:4687元。

这个问题大部分人应该能知道答案肯定不是又回到4999 。这个问题的意义是,让大家知道百分数的变动表示的是某个数字对比它原来的变化。所以看到增长百分之多少,我们最好弄清楚这个增长的事物到底是什么。

比如我投资的唱吧上地店,说这个月业绩比上个月增长了100%。但是上个月才TM分红几块钱,增长100%还TM是几块钱。。。

再说一个很有意思的概念,百分差百分率是不同的。

举个例子:今年6月份,各地开始降低企业五险一金的费率,北京的失业保险从1.2%降低到1%。站在企业税负重的角度我们可以说,企业社保等费用才降低 0.2个百分点。站在政府角度会说,我们这次调整给企业减税高达 16.7% (1.2-1.0)/1.2 so,同一个数字有不同的解读。

中位数:

如果我和7、8位小伙伴在街边吃麻辣烫,我们都是普通白领,假设平均身价是20万。突然王思聪带着一位网红过来吃麻辣烫,我们的平均可能就是4个亿。。。 显然这个平均值这时候描述我们的身价就很不靠谱。但是用中位数就不一样了,我们8位小伙伴的中位数是20万,来了一位思聪,中位数一样是20万附近。所以有时候描述平均总体水平,要用中位数而不是平均值!

scmlt

继续阅读“《赤裸裸的统计学》阅读笔记整理”

产品迭代经验——修改客户体验的权益

一款收费的手机软件,大部分都会设置免费的体验期(使用次数or使用时间)。体验后,用户觉得不错就会购买。一段时间内新购买的用户数除以注册用户,就是我们定义的转化率。

去年底到今年3月份我们发现转化率一直低于5%左右,没怎么变化。

clip_image002

2016.3.1~2016.3.20  转化率 4.1%

当然从1月份来看3月初的转化是有增长了一些。

clip_image004

2016.1.1~2016.3.20 转化率3.2%

遇到问题不能主观臆断,一切凭数据说话。

开始分析数据。

发现一个大问题,我们赠送的免费权益条数太多了,而且不受时间限制。

clip_image006

居然高达 70%的用户还有体验的条数,难怪不会购买,我都能正常用,干嘛购买?

于是乎,3月底修改了注册赠送的条数,从60降到5,同时设定了7天有效期,送的5次权益不用,7天后也就到期了。如果想继续试用,要么付费;要么介绍好友注册送5条。

调整后的4月份,效果立竿见影!

clip_image008

20164.1~2016.4.30 转化率9.1% 翻了一倍不止!

总结:

1、 遇到问题,先分析数据

2、 分析的数据要和问题相关

3、 有了结论立马行动,改进后马上观测是否解决问题

4、 及时复盘,解决或者没解决的原因。成功/失败的主观/客观原因?

《结网》阅读笔记——产品经理经典书籍1

《结网》阅读笔记

《结网》阅读笔记

概念

概念

作品创作6步骤

作品创作6步骤

  1、概念
  2、形式
  3、风格
  4、结构
  5、工艺
  6、外观
概念从哪来——不要重复发明轮子(模仿)

概念从哪来——不要重复发明轮子(模仿)

  1、更好的商业模式
  2、更好的市场定位
  3、更好的时机
  4、更好的平台
  5、更好的管理
概念2.0

概念2.0

  1、服务而不是打包的软件
  2、控制独特的数据源,并且用户越多内容越丰富
  3、把用户作为共同开发中来信任
  4、借力于集体智慧
  5、通过用户自助服务来发挥长尾效应
  6、轻量级的用户界面、开发模式商业模式

商业模式

商业模式

1、先有目标用户再有为目标用户服务的点子

1、先有目标用户再有为目标用户服务的点子

  朋友测试法
  发布最小可行产品

发布最小可行产品

   不一定要开发出来,可以是描述
   可以是人工实现的流程
   对概念进行验证
2、概念是否给用户带来好处、被实践过吗?
3、通过哪些渠道获取用户
4、用户希望与产品保持哪种关系

4、用户希望与产品保持哪种关系

  1、个人助理
  2、自助服务
  3、自动化服务
  4、社区
  5、共同创作
5、如何赚钱

5、如何赚钱

  1、向个人用户收费
  2、向企业用户收费
6、资源+关键任务+合作伙伴
7、成本

7、成本

  往往研发成本只占了20%
8、获取投资

8、获取投资

  1、产品概念是否处于趋势上,是否在满足强需求和频发需求?
  2、是否找到了有效的突破口,突破之后如何建立壁垒?
  3、团队能力与产品概念是否匹配?

3、团队能力与产品概念是否匹配?

   不是纸上谈兵
   不浪费时间重新发明轮子
   领导力
  用户的历史行为(特别是购买行为)比他们的当前意愿更有价值

创造

创造

1、项目管理是关键

1、项目管理是关键

  任务/目标分解成小连续的小目标
  对结果进行预期、让所有人上船、把事情做完
2、成本

2、成本

  研发和非研发,关注非研发成本
3、用户体验

3、用户体验

  别让我想、别让我等、别让我烦
  CE(customer engagement 客户参与)

CE(customer engagement 客户参与)

   1、提供明显反馈入口
   2、订阅关键字搜索结果
   3、建立核心用户群
   4、跟踪用户行为
   5、流失用户回访
4、PCDA框架

4、PCDA框架

  1、plan 计划
  2、Do 执行
  3、Check 检查

3、Check 检查

   确认是否与计划相符、确认是否让用户真正满意
  4、Act 处理
5、网站分析越早越好,越详细越好,开发时候就要考虑未来需要分析的数据提前埋点

分析、拉动

分析、拉动

1、利用平台拉动或者利用口碑拉动

1、利用平台拉动或者利用口碑拉动

  广告、植入、融合
2、持续更新

2、持续更新

  更新本身、更新频率

更新/后期

更新 后期

1、优雅降级比如邮箱的基本版
2、获取竞争对手情报

Entity Framework 学习——了解

        ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发表。
        ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。

ADO.NET Entity Framework自.NET 3.5以来就被集成于.NET中,现在最新版本是Entity Framework 5.0。
版本
支持.NET
发布情况
备注
Entity Framework 3.5
2.0+
包含于.NET 3.5中
支持EDMX生成,通过扩展可支持POCO类的生成
Entity Framework 4.0
4.0+
包含于.NET 4.0中
Entity Framework 4.X
4.0+
可通过NuGet获取
支持Database First、Model First、Code First三种生
成模式
Entity Framework 4.5
4.5+
集成于.NET 4.5中
Entity Framework 5.X
4.5+
可通过NuGet获取
支持枚举字段,性能有较大提升,支持.NET 4.0的版本
为Entity Framework 4.4

        以上从百度百科摘来的,简单说就是一种ORM框架。

        以前编程都是原生的ADO.NET,步骤实在繁琐,开发效率也不高,小项目小系统性能上的优势又不明显,维护起来也很累。草根创业的初期,公司开发人员可能就1个,没有专门的美工、DBA等。能最快开发出东西才是王道,同时又要灵活可扩展规范,这需要技术人员基础扎实、学习能力强、需要什么学习什么,马上用什么。这几天学习了下EF发现优点挺多,可以认真关注于开发、更快的开发出一个小型项目。对比下ADO.NET  EF的Database-first Model-first Code-first 开发一个简单应用:

image

简单的一个登录表。

ADO.NET 登录代码如下:

private static void Main(string[] args)
        {
            while (true)
            {
                string username;
                string password;
                string sqlstr = "server=.;uid=sa;pwd=sa;database=Test";
                Console.WriteLine("请输入用户名:");
                username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                password = Console.ReadLine();
                using (SqlConnection conn = new SqlConnection(sqlstr))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = conn;
                        cmd.CommandText = "select COUNT(*) from LoginUser where " +
                                          "username=@username and password=@password";
                        cmd.Parameters.Add(new SqlParameter("@username ", username));
                        cmd.Parameters.Add(new SqlParameter("@password ", password));
                        conn.Open();
                        int result = (int)cmd.ExecuteScalar();
                        if (result > 0)
                        {
                            Console.WriteLine("登录成功。");
                        }
                        else
                        {
                            Console.WriteLine("登录失败。");
                        }
                    }
                }
            }
        }

image

DataBase-first(数据库先行):

image

第一步:在项目里面添加一个ADO.NET 实体数据模型

image

image

image

添加完成后,主程序代码如下:

static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("请输入用户名:");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                TestEntities dbcontext = new TestEntities();
                var result = (from r in dbcontext.LoginUser
                    where r.UserName == username && r.PassWord == password
                    select r).SingleOrDefault();
                if (result !=null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

image

核心代码少了好多,直接写上linq查询语句,其他交给EF处理。

Model-first 模型先行,数据库可以先不用建立,直接在VS里面建模然后生成到数据库。

还是添加ADO.NET实体模型,不过选择空模型:

image

在模型界面空白处右击,弹出如下菜单,选择 新增-》实体。

image

image

接着在新增加的实体上面右击,选择添加 标量。

imageimage按下 F4 可以在属性窗口设置 类型,是否可空,以及最大长度等。

添加完全部的 标量后 ,在空白地方单击右键:

image

image

点击完成后,在资源管理器里面会多出一个:Model1.edmx.sql文件。然后空白地方右击

image

一执行数据库里面就会多新增加的LoginUser2表。

代码如下,新建立的表没有数据,顺便添加了一个用户:

static void Main(string[] args)
        {
            Model1Container dbcontext = new Model1Container();
            LoginUser2 newuser = new LoginUser2();
            newuser.UserName = "sa";
            newuser.PassWord = "sa";
            dbcontext.Entry(newuser).State = EntityState.Added;
            dbcontext.SaveChanges();
            while (true)
            {
                Console.WriteLine("请输入用户名:------ModelFirst----------");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                var result = (from r in dbcontext.LoginUser2
                              where r.UserName == username && r.PassWord == password
                              select r).SingleOrDefault();
                if (result != null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

image

接下来就是最适合新的中小项目开发的Code-first,直接写代码:

第一步:添加模型类(loginuser3.cs),添加DataAnnotations引用

image

接下来:添加一个Context 类,添加EF5.0的引用,同时在APP.CONFIG里面添加数据库的连接字符串testlogin。

image

好了,这样就OK了,接下来就是写代码了。

 static void Main(string[] args)
        {
            LoginContext dbcontext = new LoginContext();
            dbcontext.Database.CreateIfNotExists();//如果没有数据库就创建一个
            LoginUser3 newuser = new LoginUser3();
            newuser.UserName = "sa";
            newuser.PassWord = "sa";
            dbcontext.Entry(newuser).State = EntityState.Added;
            dbcontext.SaveChanges();
            while (true)
            {
                Console.WriteLine("请输入用户名:------CodeFirst----------");
                string username = Console.ReadLine();
                Console.WriteLine("请输入密码:");
                string password = Console.ReadLine();
                var result = (from r in dbcontext.Loginuser
                              where r.UserName == username && r.PassWord == password
                              select r).SingleOrDefault();
                if (result != null)
                {
                    Console.WriteLine("登录成功。");
                }
                else
                {
                    Console.WriteLine("登录失败。");
                }
            }
        }

运行后会发现,多出来了LoginUser3这个表。

image

ASP.NET MVC5 入门九——添加新字段、数据库迁移

在Code First开发中,不可能一开始创建的数据库类就一直不变可能随着需求或者其他原因要做调整。假设我们在原有的Movies里面添加一个评级属性。

image

然后我们运行下看看。

image

异常了!注释掉刚才添加的代码,在运行看看:

image

发现可以访问,这是因为当EF CodeFirst的数据模型发生异动时,默认会引发一个 InvalidOperationException异常。有个解决方法是,在Global.asax 里面的Application_Start方法加上 一个 SetInitializer方法,这个方法会让数据库删除在重新创建。就是因为如此,有了大量的测试数据显然不能用这个方法!

使用Code First数据库迁移

首先,我们删除系统自动创建的Movies.mdf文件。如下图,如果在App_Data 里面没有看见,请单击显示所有文件图标。

image

然后进入(PM)软件包管理控制台 (视图——》其他窗口——》程序包管理控制台)输入以下指令:Enable-Migrations

image

出现错误那是因为项目中有多个数据类别,所以需要选择一个。重新输入命令:Enable-Migrations –ContextTypeName MVC5DEMO.Models.MovieDBContext 来指定需要迁移的数据库上下文。image

好了,我们会发现项目中多了一个文件夹(Migrations)和Configuration.cs文件。

image

然后我们根据注释的提示,修改下Seed方法的内容为如下:

protected override void Seed(MVC5DEMO.Models.MovieDBContext context)
        {
            context.Movie.AddOrUpdate(i => i.Title,
                new Movie {
                Title = "虎胆龙威",
                ReleaseDate=DateTime.Parse("2013-03-16"),
                Genre="动作",
                Price=120},
                new Movie {Title = "致青春",
                ReleaseDate=DateTime.Parse("2013-04-26"),
                Genre="爱情",
                Price=60} ,new Movie {Title = "中国合伙人",
                ReleaseDate=DateTime.Parse("2013-05-18"),
                Genre="剧情",
                Price=90} ,new Movie {Title = "小时代",
                ReleaseDate=DateTime.Parse("2013-06-27"),
                Genre="脑残",
                Price=30} 
                );
        }

添加完成后请按下 CTRL-SHIFT-B 生成解决方案

image

然后我们创建一个数据库迁移的版本,就是初始版本。在管理控制台输入 add-migration Initial 其中Initial可以随便取名。

image

image 文件夹下面多了一个日期+Initial.cs 的文件。

接着我们在PM(程序包管理控制台)输入 Update-Database 指令。

image

这个指令会检测刚才那个cs文件,里面包含数据库的结构的说明,然后运行 Seed里面的方法填充数据。然后我们F5运行看看。

image

一切正常!

把新属性添加到Model

接下来我们给电影模型添加一个分级功能,类似《小时代》少儿不宜!把我们刚刚注释掉的再反注释,然后重新生成下。生成完后还需要修改几个地方,如果你有自己设定Bind属性,还要把新的字段添加进去,同时要去视图修改下。我们去Index.cshtml修改下:

image

红色框框就是新增加的2处。同样的,Create.cshtml也需要添加。

image

好了之后我们运行看看。

image

出现错误了!那是因为现在的模型已经多了一个字段,而数据库还没有变化。可以用上文提到的让系统自动把数据库砍掉在重新生成,或者自己手动修改数据库。不过这些都不是最优的,最好的是使用Code First 的数据库迁移。第一步,更改Seed文件,在默认的那些测试数据中添加分级信息。

image

然后再PM里面输入  add-migration addRating (名字: addRating 可以随意,最好有意义)

image

会发现多了一个up和down方法,记录着数据库的变动。接着我们生产解决方案,然后再PM输入:Update-database 命令。然后运行看看:

image

image

评级出现了,我们点击 Create New 看看:

image

image

一切正常,都能添加。但是这样还不够智能,接下来我们设置自动数据库迁移。

自动数据库迁移

在Global.asax里面的 Application_Start方法加上以下代码:

image

这样以后一旦数据库模型变化,就能自动进行升级。

下一步:添加验证。

ASP.NET MVC5 入门十——添加验证

在本教程:将要在Movie 模型添加验证逻辑确保用户添加或者编辑时数据无误。

DRY(不要重复你自己)

ASP.NET MVC 的核心设计原则之一就是DRY(Don’t Repeat Yourself)。ASP.NET MVC 鼓励你为一个功能或者行为编码一次,在以后需要用到的地方一直复用就可以。这样可以减少编写代码的数量,同时易于维护。

在ASP.NET MVC 和 EF code first 中提供的验证支持就是DRY的好例子。可以只声明一次,然后在任何需要的地方中执行规则。

向Movie模型中添加验证规则

打开 Movies.cs 文件,然后我们来更新Movie类。利用内置的 Required、StringLength、RegularExpression 和 Range Validation 特性添加以下内容:

image

弄完后,我们看看数据库的设计:

image

显然和规格不符,我们来修改它。先生成解决方案,接下来就是利用数据库迁移功能自动生成。命令如下:在软件包管理器控制台输入

  • add-migration DataAnnotations
  • update-database

命令完成时,VS会自动打开一个类文件,我们可以看到其中的Up方法。

public override void Up()
        {
            AlterColumn("dbo.Movies", "Title", c => c.String(maxLength: 60));
            AlterColumn("dbo.Movies", "Genre", c => c.String(nullable: false, maxLength: 30));
            AlterColumn("dbo.Movies", "Rating", c => c.String(maxLength: 5));
        }

Genre 字段不再是可空的,标题和分级都添加了验证条件。我们重新看看数据库的设计:

image

已经改过来了。相关限制条件在源码里面很清楚了,不在细说。

接下来我们看看效果: 进入 localhost:****/Movies/Create

image

 

很明显了,如果没有通过本地客户端的验证,点击Create是不会向服务器提交表单的。

接来下我们看看实现的过程看看在创建视图和创建Action方法时发生了什么

先看看 MoviesController 类中的Create方法:

image

会发现和以前完全一样,没有任何代码上的变化。第一个Create (GET方法)是用来显示初始创建的窗体。第二个(POST版本的)方法先验证是否有错误(ModelStateIsValid)如果存在错误,则重新显示窗体,否则就在数据库中保存新的电影信息。客户端实现校验是通过 javascript 假如我们禁用它看看会发生什么。禁用方法不同浏览器有不同的选项,搜索一下就可以。

禁用 chrome 后,刷新重新输入:

image

没错误提示,我们点击Create

image

很明显,还是有验证,接下来我们输入正确的看看。

image

成功添加进去了,感兴趣的话,在movie.cs 的 POST Create请求添加断点,会发现输入错误的信息,IsValid 是false ,输入正确是True。

如果你添加了断点测试 启用/禁用 JavaScript 2种情况下Create方法的调用会发现,在启用JS的情况下,如果客户端检测到错误是不会调用Action里面POST的Create方法。如果禁用了JS功能,到表单提交到服务器,会通过 ModelState.IsValid 来验证是否数据存在错误。

下一部分:这次改进了 Create 方法的数据验证,下一次就是 Details 和 Delete 方法了。

ASP.NET MVC5 入门六——通过控制器访问数据

首先,我们要添加一个新的控制器,在解决方案资源管理器的Controllers文件夹右键单击,添加,支架。

image

在对话框中,我们选择下图这个: MVC5 控制器带有 读/写 和 视图。

image

名字就叫做:MoviesController 。model class 选择 MVC5DEMO.Models里面的 Movie。

image

image

数据上下文选择 我们的MovieDBContext。然后点击ADD。

image

恩,悲剧了。我们重新修改Models\Movie.cs文件,把Movies 改成Movie。

image

然后ASP.NET MVC5将会自动创建增删查改(CRUD)的方法(action)和视图(views)。是的,一个完整功能的网站就OK了。我们F5运行看看。

image

当然,没有数据,因为我们没有添加任何数据。接下来我们点击 Create New 添加新的电影条目。

添加电影:

image

image

我们来看看代码

继续阅读“ASP.NET MVC5 入门六——通过控制器访问数据”

ASP.NET MVC5 入门七——完善视图

本节中,我们来修改上一篇博文里面系统自动生成的一些代码,下图是运行后的截图:

image

可以看到有很多不足比如:英文太多,日期格式太长等。

我们回到 Models\Movie.cs 添加几句代码:

image

红色框起来的就是增加的部分,using 语句里面的那个 DataAnnotations 我们下载在说。Display 属性指定要显示的字段的名称。原来没有写的话,就是数据库字段的名称,现在我们写上中文了。DataType 指定字段显示的格式,改为日期这样的话时间就不会显示出来,更美观了。

image

在上图左下角,能看到编辑的链接。这个链接是由 index.cshtml 里面的 Html.ActionLink 方法生成的:

image

Html是个Help 类,调用 ActionLink方法来动态生成HTML超链接。ActionLink方法第一个参数指定显示的字符串,第二个参数是 要调用的Action的名称,第三个参数是一个匿名对象。

按照前几篇讲的 /Movies/Edit/3 和 /Movies/Edit?id=3 是等价的。这2个url都是传递给Movies的Edit方法来去执行,同时给出ID。我们去看看这个方法:

image

第一个方法是接受GET请求,第二个是接受HttpPost 。可以看到第二个有个属性【HttpPost】而第一个没有,因为默认就是GET请求。我们注意到第二个Edit方法前面还有一个【ValidateAntiForgeryToken】这个主要是用来防止跨站请求伪造(CSRF)。这个需要和视图里面@Html.AntiForgerToken() 配合使用,会生成一个隐藏的防伪标记。下次写个文章介绍一下。

在上面的GET的Edit 方法,调用实体框架的FIND方法查找时候存在对应id的电影,如果存在就返回给视图,不存在就返回404。下面是视图里面的代码:

image

image

第一行代码,绑定了一个强类型对象。然后接下来利用这个对象,生成 <label> <input>等代码。Html.LabelFor 这个帮助类的方法显示对应的标题,Html.EditorFor 用来生成<input>标签,Html.ValidationMessageFor 就是用来进行验证的。

image

image

生成这么优美的控件,居然一句代码都不用写,真好!

image

这是表单的源文件,可以看到有个隐藏域,存放着上文的那个 RequestVerificationToken 等信息。从这句话可以看出<form action=”/Movies/Edit/2″ method=”post”>当我们点击save后,表单的所有数据都将用post请求发送到 /movies/edit/2 这个url。

回过头来看POST请求的EDIT方法:

image

第一步,判断表单中的模型所有属性时候都可以修改或者更新。如果是有效的,就把实体框架状态改为修改,然后更新到数据库。保存之后,重定向到Index 这个方法,我们就会看到修改后的效果。

在下一个教程:我们来实现搜索功能。

ASP.NET MVC5 入门八——添加搜索

添加一个搜索的方法和搜索的视图

接下来我们添加搜索功能,可以根据电影的标题搜索。

第一步:更新index窗体

在最开始MVC入门说过,MVC一个好处就是关注点分离。当我们需要修改和数据有关的东西,只要去修改Controller 就可以。现在我们去修改MoviesController的Index方法:

image

第一行的LINQ查询用来选择Movies。仅仅是定义了movies代表数据库中的哪些,还没有开始查询。接下来判断查询的字符串是否为空,如果不为空就开始查询标题一样的电影。

s => s.Title 这是一个Lambda 表达式。一般用在基于方法的LINQ查询中,比如上面的Where。

我们现在F5运行一下看看,在地址栏后面加上?searchString=中国

image

image

当然,我们不能让用户一直在地址栏加上那么一串来搜索,普遍做法是,在页面顶部加一个搜索框。看到这个就知道需要改动View部分。我们打开Views\Movies\Index.cshtml 文件,在Create New后面加上如下代码:

image

image

可以发现,我们并没有添加控制器中Index的POST请求,也能正常查询。我们现在添加HttpPost方法

image

image

我们会发现,GET和POST请求的url都是一样的,都是 localhost:xxx/Movies/Index 。假如我们想要把链接发给朋友,让他知道我想看哪些电影,但是这些查询信息却没有在url里面体现,这样不肯能发送给朋友。

解决方法是利用 BeginForm 的重载,有个指定POST请求添加搜索信息到url中。

@using (Html.BeginForm(“Index”,”Movies”,FormMethod.Get))

改成如上的代码,就可以指定用GET方法提交,哪怕你已经有了HttpPost 的方法。

image

接下来:添加更多搜索

继续阅读“ASP.NET MVC5 入门八——添加搜索”

ASP.NET MVC5 入门五——使用LocalDB

在上一篇博文《ASP.NET MVC5 入门四——添加模型》中,我们创建了M模型对应的模型类。最终我们还是要在数据库中创建真实的数据库和表,字段等。对于开发人员,数据库在开发过程中只是需要一些简单的功能,为了开发而安装一个企业版的SQL SERVER太浪费了。还好微软在SQL2012中提供了LocalDB这个新特性,LocalDB也是VS2013默认就安装的。

什么是LocalDB

简单说就是 SQL免费版的SQL Server Express 的轻量级版本。专门为开发人员创立的,易于安装,无需管理,编程语言和T-SQL语言都和正常的数据库一样。同时不耗费系统支援,没有服务,需要时自动启动停止。其他更高级的功能就不说了,够用,免费,好用才是王道。同时LocalDB数据库也能方便的移植到SQL Server。

添加连接字符串

默认情况下,实体框架会查找和对象同名的上下文里面的连接字符串。在项目的根目录下面打开Web.config文件:

image

默认的连接字符串:

image

我们在<connectionStrings>里面添加一个新的连接字符串:

<add name=”MovieDBContext” connectionString=”Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Movies.mdf;Integrated Security=True”
providerName=”System.Data.SqlClient”
/>

可以看出2个连接字符串都很相似。第一个名字是 DefaultConnection 用来控制可以访问该应用程序的成员资格数据库。我们添加自己的Movie.mdf数据库,不使用成员资格数据库。连接字符串的名字必须和DbContext类的名称相匹配。

添加好了之后,就是

下一步:从控制器访问模型中的数据。