也许有人问,为什么要用EF创建爱你数据表,code first好处是什么?

使用EF创建数据库/表,只需要设计简单的C#类,再表内容变化的时候他会自动更新数据库结构,并且保留原有数据。

EF很强大,支持主外键并且能生成和db里一样的数据类型。由于我们这两个表简单,关于进阶的知识我会放在这篇文章的底部作为附录。

根据需求,我们有两种 input 文件。一种是trend 的一种是bar的 我们先来看看这两种文件里的数据:

Trend :

id    taskid    taskname   time    b1    equal    b2    uncertain    grandtotal
1 task1 --

Bar :

KeyWord    B1Better      Equal    B2Better     Winner
联众 B1
疯狂倒计时 B2
张娜拉 B1
截图软件 B2

我们需要show 2个 chart。

那么我们设计2个表来存储 trend chart 和barchart 的数据,名为Trend 和Bar(本来应该是3个表。由于我们是为了自己练习,设计2个就好。)

到这里,我才发现我们还没为我们的project 起名字呢。叫什么好呢?我们就叫 ReportingSyncer吧。

Reporting(报表),sync(同步),为什么加er?现在的project 命名的时候往往都拟人化,显得生动外加比较给力。

【开始动手】

打开vs 2010创建一个新的class library 命名为ReportingDBManager。删除自动生成的class1.cs 。

修改sln(解决方案的名称为ReportingSyncer)。

修改命名空间:右键点击ReportingDBManager。properties(属性)->Application:CnBlogsDemos.ReportingDBManager。为啥要改?因为引用起来方便一点,而且也显得专业:)

现在你的sln应该是这样

添加Entity Framework 引用,得到这个dll 有两种方法:

使用NuGet ,或者去下载一个dll。在这里我使用Nuget ,EF最新版是4.3.1

【创建表的映射类】

添加完引用之后,我们就开始创建我们的表类了。

添加两个class ,名为 Trend 和 Bar。

对应上边input 文件的类型,我们设计两张 匹配的表。

bar.cs:

namespace CnBlogsDemos.ReportingDBManager
{
using System.ComponentModel;
using System.ComponentModel.DataAnnotations; public class Bar
{ [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //主键 自增
public int ID { get; set; }
public int TaskID { get; set; } [MaxLength()]
public string TaskName { get; set; } /*有朋友要问了,导入文件里明明没有以上两个字段,为什么要设定他们?
因为导入的时候是根据每个task 导入的,我们会在commandline里数据task id 和task name
这样才可以让两个表联系起来,后期好做报表的drill down (钻入)
*/ [MaxLength()]
public string KeyWord { get; set; } public int B1Better { get; set; } public int Equal { get; set; } public int B2Better { get; set; } [MaxLength()]
public string Winner { get; set; } public string type { get; set; } [DefaultValue(true)]
public bool IsActive { get; set; }
}
}

trend.cs

namespace CnBlogsDemos.ReportingDBManager
{
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations; public class Trend
{
public int id { get; set; } public int TaskID { get; set; } public string TaskName { get; set; } public DateTime Time { get; set; } public int B1Better { get; set; } public int Equal { get; set; } public int B2Better { get; set; } public int UnCertain { get; set; } public int GrandTotal { get; set; } [MaxLength()]
public string type { get; set; } [DefaultValue(true)]
public bool IsActive { get; set; }
}
}

两个表类创建好了。如何和数据库联系到一块呢?我们需要使用EF创建一个dbcontext类了。

添加新类:DbStoreContext.cs

namespace CnBlogsDemos.ReportingDBManager
{
using System.Data.Entity;
using System.Data.Entity.Migrations; internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<DbStoreContext>
{
public ReportingDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
} public class DbStoreContext : DbContext
{
public DbStoreContext()
: base("name=ReportingDataBase")
{
Database.SetInitializer<DbStoreContext>(
new MigrateDatabaseToLatestVersion<DbStoreContext, ReportingDbMigrationsConfiguration>()); this.Configuration.LazyLoadingEnabled = false;
} public DbSet<Bar> Bars { get; set; }
public DbSet<Trend> Trends { get; set; } }
}

上边的两个Dbset 就是我们要创建的两个表。

检查项目中app.config文件,我们会看到:

  <entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
<parameters>
<parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>
</defaultConnectionFactory>
</entityFramework>

EF默认指定的数据库是本地的Express。我们可以更改成其他标准数据库或者是远程数据库(当然,你要有权限哦)。

我们想在另一个project 里指定数据库连接。先把这个appconfig删除。

有朋友要问了,什么时候能生成DB,table啊?我怎么看不见?

别急,在我们第一次调用这个dbcontext 类的时候就会创建/更新啦!

我会在下一章做讲解。

【附录】

EF创建table 时候的一些技巧,查了好多资料,希望能帮助大家:

主键:

[Key]
public int EngineID { get; set; }

自增主键:

[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EngineID { get; set; }

可以编辑的主键(默认是readonly)

[Key,Editable(true),DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EngineID { get; set; }

非空字段:

  [Required]
public string EngineName { get; set; }

限定长度的非空字段:

  [Required, MaxLength()]
public string EngineName { get; set; }

外键比较特殊,需要解释一下两个table之间的关系。

table1包含 一个 字段 taskID。

table task 的主键是taskID。需要创建爱你一个 task类型的字段。关系如下:

public class Table1
{
[Required, ForeignKey("Task")]
public int TaskID { get; set; } public virtual Task Task { get; set; } } public class Task
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskID { get; set; }
}

时间戳:

        [ConcurrencyCheck]
[Timestamp]
public byte[] TimeStamp { get; set; }

c# 里的 int32 对应 db 里的int 。int16 对应 smallint,bool 对应bit,byte[]对应binary等等。

参考页面:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api;http://qingqingquege.cnblogs.com/p/5933752.html;https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/releases/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web-api-2

【步步为营 Entity Framework+Reporting service开发】-(2) Code Fir的更多相关文章

  1. .NET Entity Framework (with Oracle ODP.NET) -Code First

    上一篇文章介绍了.NET Entity Framework ,并演示了Model First模式,本文将继续讨论 Code First 模式的实现. 一.摘要 1.目标 本文验证了通过Oracle D ...

  2. EF3:Entity Framework三种开发模式实现数据访问

    前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...

  3. Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移

    目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...

  4. Entity Framework 5.0系列之Code First数据库迁移

    我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...

  5. 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)

    从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...

  6. Code First :使用Entity. Framework编程(8) ----转发 收藏

    第8章 Code First将走向哪里? So far, this book has covered all of the Code First components that reached the ...

  7. Entity Framework 5.0系列之自动生成Code First代码

    在前面的文章中我们提到Entity Framework的"Code First"模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework P ...

  8. 【转】Entity Framework 5.0系列之自动生成Code First代码

    在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power Tools ...

  9. ADO.NET Entity Framework -Code Fisrt 开篇(一)

    ADO.NET Entity Framework -Code Fisrt 开篇(一) 2012-12-25 15:13 by 易code, 911 阅读, 0 评论, 收藏, 编辑 ADO.NET E ...

随机推荐

  1. poj1721

    题解: 直接暴力循环节 然后再做几次 代码: #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  2. FORTH 发展(部分)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. DevExpress之TreeList控件用作导航使用说明

    最近项目用的是DEV界面框架, 由于各控件属性太多,以免遗忘.所以做个笔录.也方便有这方面需求的网友交流学习.下面开始讲解具体实现步骤. 一.先布局,设置相关属性. 1.首先到工具箱拖一个 TreeL ...

  4. SQL-52 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列

    题目描述 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列CREATE TABLE `employees` (`emp_no` int(11) ...

  5. uboot使用笔记

    一.从最基础的uboot开始 首先是打算直接用程序把已有的镜像烧写进去sd卡里面,但是问题来了,烧写不进去 原因: 可能是windows 7的某些版本和win⑩的系统为了保护磁盘,设定了保护等级,直接 ...

  6. javascript学习笔记_1

    1.JSON的遍历 for(var i in json){  alert(json[i]; }2.arguments 可以理解为是一个数组,并且建有json的部分能力 css(obj,attr,val ...

  7. poj1002总结

    1.之前一直是runtime error,没有找出具体原因,把冒牌排序改成了合并排序,当输入是100000行时,从大约10s变到1s内 2.感觉是atoi指针导致的,当判断atoi的入参不为NULL时 ...

  8. javascript数据加减问题

    需要parseInt把获取到的html(),text()的值转换为数字型,然后进行加减乘除操作就可以了:

  9. struts2之数据校验

    概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过四种方式来阐述Struts ...

  10. python基础 字典练习

    练习1:info = [ {'wangming': { 'money':1111, 'car':['bmo','bsj'], 'info':{ 'phone':1511111, 'age':18} } ...