也许有人问,为什么要用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. java web中验证码生成的demo

    首先创建一个CaptailCode类 package com.xiaoqiang.code; import java.awt.*; import java.awt.font.FontRenderCon ...

  2. android 重启app

    package com.xproject.utility; import java.lang.reflect.Field; import java.lang.reflect.InvocationTar ...

  3. 【Appium】Appium工作原理(2)

    Appium原理 面试的时候,被问到appium原理,一点不会,实在尴尬. 大家可以直接翻看原作https://blog.csdn.net/jffhy2017/article/details/6922 ...

  4. ZABBIX安装过程中relocation error报错解决办法

    错误提示: /usr/sbin/zabbix_server: relocation error: /usr/sbin/zabbix_server: symbol mysql_next_result, ...

  5. 关于Linux时间设置的总结

    系统环境:centos Linux的时间有两种,一种是系统时间,一种是硬件时间. 系统时间的查看:#date 系统时间的设置:#date -set 时间同步工具准备 Linux进行时间同步要使用一个工 ...

  6. Python知识体系思维导图:

    基础知识 数据类型 1.序列 2.字符串 3.列表和元组 4.字典和集合 循环 & 判断

  7. Java赋值

    public class Car { 方法1: private String 品牌="初始化值"; private String 价格; 方法2: public Car(Strin ...

  8. python+appium 自动化2--元素定位uiautomatorviewer

    出处:https://www.cnblogs.com/yoyoketang/p/6128741.html 前言: 可以打开手机上的app了,下一步元素定位uiautomatorviewer,通过定位到 ...

  9. 20165214 2018-2019-2 《网络对抗技术》Exp1+ 逆向进阶 Week4

    <网络对抗技术>Exp2 PC平台逆向破解之"MAL_简单后门" Week4 一.实验内容 Task1 自己编写一个64位shellcode.参考shellcode指导 ...

  10. 计算1~100之间,能被3整除但是不能被7整除的数的和(C语言)

    #include<stdio.h> int main(agrc *agrv) { int n,i; int sum=0; scanf("%d",&n); for ...