【步步为营 Entity Framework+Reporting service开发】-(2) Code Fir
也许有人问,为什么要用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的更多相关文章
- .NET Entity Framework (with Oracle ODP.NET) -Code First
上一篇文章介绍了.NET Entity Framework ,并演示了Model First模式,本文将继续讨论 Code First 模式的实现. 一.摘要 1.目标 本文验证了通过Oracle D ...
- EF3:Entity Framework三种开发模式实现数据访问
前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...
- Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移
目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- 安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)
从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代 ...
- Code First :使用Entity. Framework编程(8) ----转发 收藏
第8章 Code First将走向哪里? So far, this book has covered all of the Code First components that reached the ...
- Entity Framework 5.0系列之自动生成Code First代码
在前面的文章中我们提到Entity Framework的"Code First"模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework P ...
- 【转】Entity Framework 5.0系列之自动生成Code First代码
在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power Tools ...
- ADO.NET Entity Framework -Code Fisrt 开篇(一)
ADO.NET Entity Framework -Code Fisrt 开篇(一) 2012-12-25 15:13 by 易code, 911 阅读, 0 评论, 收藏, 编辑 ADO.NET E ...
随机推荐
- UML介绍
UML是什么 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所 ...
- python之路-模块初识
# sys模块 import sys #print (sys.path) #打印环境变量 print (sys.arge) print (sys.arge[2]) # os模块 import os # ...
- 搭建本地yum源
本地yum源其实非常容易搭建 首先进入/etc/yum.repos.d/ 将原来的yum源备份后移除,然后新建dvd.repo: 内容如下: [base] name=base baseurl=file ...
- js jquery 正则去空字符
1.正则去空字符串: var str1=" a b c "; var strtrim=str1.replace(/\s/g,""); 2.js去前后空字符串: ...
- iis设置http重置到https
http://www.cnblogs.com/tangge/p/4259749.html 1.购买SSL证书,参考:http://www.cnblogs.com/yipu/p/3722135.html ...
- Leet Code 3. Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- 前端开发【第二篇: css】
css概述 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS ...
- c++ string 转double
#include <iostream>#include <sstream> //使用stringstream需要引入这个头文件using namespace std; Type ...
- filter以及reduce的用法
简单的写了就几个例子 # 删掉偶数 li = [1,2,3,4,5,6,7,8,9,10] print(list(filter( lambda x : not x % 2 ==0 ,li))) #保留 ...
- windows 下安装MySQL 服务无法启动类问题
解决方案: 1 执行 mysqld.exe -nt remove 2 执行 mysqld --initialize(中间是两个中划线) 3 执行 mysqld.exe -nt install 4 执行 ...