也许有人问,为什么要用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. CPU的系统总线

    主频:时钟频率,用来表示CPU的运算速度.主频=外频*倍频. 外频:基准频率,系统总线的工作频率,外频是CPU与主板之间同步运行的速度,大部分电脑系统中外频也是内存与主板之间同步运行的速度,在这种方式 ...

  2. 【Alpha】事后分析

    Alpha阶段终于告一段落,我们的团队也完整经历了从提出设想.用户需求分析,到开发.测试,再到部署上线.推广的流程."葫芦娃不想写代码"团队还是较出色地完成了Alpha阶段的工作, ...

  3. aspectj编程简介

    现在java生态中spring大行其道,一般使用aspectj进行切面编程使用注解方式实现,比较少使用原生的aspectj编程,网上的资料也比较少.最近工作中需要封装redisson客户端提供统一的r ...

  4. SQL-53 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees

    题目描述 按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employeesCREATE TABLE `dept_emp` (`emp_ ...

  5. Python之字典方法

    def clear(self): # 清除所有内容 """ D.clear() -> None. Remove all items from D. "&q ...

  6. sse矩阵乘法 应该是1毫秒纯运算1000次

    #include <intrin.h> #include <math.h> struct Vector4 { float x, y, z, w; }; struct Matri ...

  7. 【C#】await & Result DeadLock

    随意使用异步的await和Result,被弄得欲仙欲死,然后看了 Don't Block on Async Code,稍许明白,翻译然后加上自己的理解以加深印象. 会死锁的两个例子 UI例子 publ ...

  8. [C++]几种排序

    本文为大大维原创,最早于博客园发表,转载请注明出处!!! 1.冒泡: #include<cmath> #include<cstdlib> #include<ctime&g ...

  9. http协议发送post请求

    package post; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamR ...

  10. 使用cookie时出现“未将对象引用设置到对象实例”

    单步调试时发现,行“176”的cookie的值是null,也就是原先新建的cookie在这里没有成功request,解决的办法就是在后面添加respose.add: HttpContext.Curre ...