【步步为营 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 ...
随机推荐
- winfrom程序Datagridview列名问题
之前在做程序的时候,有遇到过这个问题: 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColume"解决方法 解决办法 ...
- sass学习笔记(一)接上个 持续学习中..(还发现个讲解的bug) sass至少我现在学的版本支持局部变量了
6.全局变量 sass暂时没有局部变量 局部定义变量会覆盖全局变量 新出!global 不过要sass 3.4版本以后 (这句呢,,我觉得是错的 开始写的时候没测试 现在发现我觉得他是有 ...
- DevExpress v18.2新版亮点——DevExtreme篇(三)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExtreme Complete Sub ...
- linux部署小结
一.连接外网1.配置网卡 vi /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO=static IPADDR= PREFIX= GATEWAY= ...
- 前段学习的roadmap
引自http://www.cnblogs.com/IMxinu/p/9693041.html
- FINS/TCP_OMRON(1)
使用FINS/ TCP与欧姆龙PLC沟通 可参考下列教学 using System.Net; using System.Net.Sockets; 上面必须使用; IPAddress ipAddr = ...
- html横向滑动案例
<style type="text/css"> .outer-container,.content {width: 630px; height: 185px;paddi ...
- classPath与PATH
PATH是window的变量,而不是Java的变量: 通常配置PATH路径是为了找到需要的XX.exe命令,而且配置在用户的变量下面: 例如:JDK中的javac与java命令在cmd中使用,需要把命 ...
- C++标准库之迭代器
迭代器大致可分为: 输入迭代器,InputIterator 输出迭代器,OutputIterator 前行迭代器,ForwardIterator 双向迭代器,BidirectinalIterator ...
- vs code 本地请求json
首先下载扩展live server 重新加载后 右下方工具栏会多出一个go live 点击go live,会默认启动chome,地址 http://127.0.0.1:5500 js脚本: $.aj ...