在Code first中使用数据库里的视图
如果想在Code first中使用数据库里的视图

(不管你出于什么原因),目前的方法有2种。
一、使用Database.SqlQuery<T>("查询语句"),如:
var query = db.Database.SqlQuery<ReplyStatusViewModel>("SELECT * FROM dbo.vReplyStatus")
然后在vReplyStatus视图的基础上进行各种查询:
var qqo = query.Where(p => p.PrdOrd.Contains("袁"));
var count = qqo.Count();//会出错!-->nullreferenceexception-->因为PrdOrd字段里有null或空值。
改为如下可通过:
var qqo = query.Where(p => p.PrdOrd != null && p.PrdOrd.Contains("袁"));
这样产生的语句是:
SELECT * FROM dbo.vReplyStatus.Where(p => ((p.PrdOrd != null) AndAlso p.PrdOrd.Contains("袁")))
但是在使用到dynamic linq时好像无法把p.ProdOrd != null 加上,dynamic linq产生的语句是:
SELECT * FROM dbo.vReplyStatus.Where(p => p.Planner.Contains("袁")).Union(SELECT * FROM dbo.vReplyStatus.Where(p => p.PrdOrd.Contains("袁"))).Union(SELECT...
这是一个模糊查询语句,在所有的字段中查找包含袁的数据。但是少了!=null 的条件,这样在计数的时候var count = qqo.Count();就会出错。
二、在上下文中加入视图模型
现在使用的是第二种方法,将ReplyStatusViewModel类加入上下文类中,然后在model创建时加入该实体(把视图假装是一个表)。提示数据迁移后,先不要update-database!把迁移文件中的内容注释掉,即把 public override void Up() 和 public override void Down()的内容清空,来进行一次空的迁移,最后更新数据库。
步骤如下:
1、创建类(ReplyStatusViewModel)该类和视图中的字段一一对应。
public class ReplyStatusViewModel
{
public int ID { get; set; }
public bool Del { get; set; }
public decimal? Qty { get; set; }
public string ReplyStatus { get; set; }
}
2、更改上下文类
public class MyContext : DbContext
{
public MyContext () : base("name=DefaultConnection") { } public DbSet<ReplyStatusViewModel> ReplyStatusViewModel { get; set; }// 映射数据库里的视图
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// vReplyStatus 就是视图的名字
modelBuilder.Entity<ReplyStatusViewModel>().ToTable("vReplyStatus");
}
}
3、添加数据迁移
PM> Add-migration test
会自动显示一个类文件,把上下文里的更改当做创建一个表:
public partial class test : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.ReplyStatusViewModels",
c => new
{
ID = c.Int(nullable: false, identity: true),
Del = c.Boolean(nullable: false),
Qty = c.Decimal(precision: , scale: ),
ReplyStatus = c.String(),
})
.PrimaryKey(t => t.ID); } public override void Down()
{
DropTable("dbo.ReplyStatusViewModels");
}
}
}
这里的内容不是我们需要的,如果数据库里还没有视图,可以在up里创建一个视图:
public override void Up()
{
Sql(@"CREATE VIEW [dbo].[vReplyStatus] AS
SELECT a.ID, ……
");
} public override void Down()
{
Sql(@"IF EXISTS
(SELECT *
FROM sys.views
WHERE object_id = OBJECT_ID(N'dbo.vReplyStatus'))
DROP VIEW dbo.vReplyStatus");
}
如果数据库里已有视图,则把内容清空即可:
public override void Up()
{ } public override void Down()
{ }
添加数据迁移时可以加一个参数:IgnoreChanges,这样Up和Down里自动为空白。

最后运行
PM> Update-Database
在Controller里可以像使用其他实体类一样来使用视图了!
public string GetMasterData()
{
using (var db = new PurchasePlanContext())
{
IQueryable<ReplyStatusViewModel> query9 = db.ReplyStatusViewModel;
query9 = from m in query9
where m.PrdOrd.Contains("袁")
select m;
var count9 = query9.Count();
...
}
}
http://stackoverflow.com/questions/13593845/how-to-create-a-view-using-ef-code-first-poco
http://stackoverflow.com/questions/20862807/mapping-database-views-to-ef-5-0-code-first-w-migrations?rq=1
http://msdn.microsoft.com/zh-cn/magazine/dn519921.aspx
这里提到一个CreateView方法,可惜我没有找到!
public partial class AddView : DbMigration
{
public override void Up()
{
this.CreateView("dbo.CasinosWithOver100SlotMachines",
@"SELECT *
FROM Casino.Casinos
WHERE Id IN (SELECT CasinoId AS Id
FROM Casino.SlotMachines
GROUP BY CasinoId
HAVING COUNT(CasinoId)>=100)");
}
public override void Down()
{
this.RemoveView("dbo.CasinosWithOver100SlotMachines");
}
}
--End--
在Code first中使用数据库里的视图的更多相关文章
- PGSQL数据库里物化视图【materialized view】
1.普通视图 数据库中的视图(view)是从一张或多张数据库表查询导出的虚拟表,反映基础表中数据的变化,且本身不存储数据. 2.物化视图[materialized view] 2.1.概念: ...
- 在Code First中使用Migrations对实体类和数据库做出变更
在Code First中使用Migrations对实体类和数据库做出变更,Mirgration包含一系列命令. 工具--库程序包管理器--程序包管理器控制台 运行命令:Enable-Migration ...
- 把数据库里面的stu表中的数据,导出到excel中
# 2.写代码实现,把我的数据库里面的stu表中的数据,导出到excel中 #编号 名字 性别 # 需求分析:# 1.连接好数据库,写好SQL,查到数据 [[1,'name1','男'],[1,'na ...
- Android项目中,在一个数据库里建立多张表
一,创建一个公共的DBAdapter; 为了在整个程序运行期间调用该公共的数据库,我们定义了一个扩展自Application的CommDB类: 1,创建唯一的数据库: public class Com ...
- PHP中的数据库三、redis
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- PHP中的数据库二、memcache
:first-child, ol li > :first-child, ul li ul:first-of-type, ol li ol:first-of-type, ul li ol:firs ...
- EF 中 Code First 的数据迁移以及创建视图
写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功 ...
- CodeIgniter (CI)框架中的数据库查询汇总
引言: 前两天业务涉及到一个拉取答题排行榜的需求,数据库里数据是这样的: 同一个人可能提交过多次成绩,所以同一个人可能会有多次记录: 同一个人提交的多次成绩中可能有至少两次成绩是一样的. 于是,查询的 ...
- CentOSLinux系统中Redis数据库的安装及配置
MongoDB 传统方式安装 关闭 SELinux 编辑配置文件:vim /etc/selinux/config 把 SELINUX=enforcing 改为 SELINUX=disabled Mon ...
随机推荐
- String比较
String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc&quo ...
- Hadoop 2.2 YARN分布式集群搭建配置流程
搭建环境准备:JDK1.6,SSH免密码通信 系统:CentOS 6.3 集群配置:NameNode和ResourceManager在一台服务器上,三个数据节点 搭建用户:YARN Hadoop2.2 ...
- 第二百六十八天 how can I坚持
早上看了个电影<我的少女时代>,挺好看的. 下午从四点玩游戏一直玩到现在,也是疯了. 晚上也没有吃饭,是不是太堕落了. 徐斌他同学今天中午过来,做了个饭,也是服了,好难吃. 还没做好准备, ...
- JavaFx版本植物大战僵尸
http://www.cnblogs.com/lslvxy/archive/2013/04/17/3026711.html —————————————————————————————————————— ...
- CodeForces 455A Boredom (DP)
Boredom 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/G Description Alex doesn't like b ...
- Hibernate入门(1)-第一个Hibernate程序
Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...
- CodeForces 567A Gerald is into Art
http://codeforces.com/problemset/problem/567/A A. Lineland Mail time limit per test 3 seconds memory ...
- HDU 3790 最短路径问题 (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 简单的最短路问题,这题听说有重边.我用spfa和dijkstra写了一遍,没判重边,速度都差不多 ...
- 一、Microsoft Dynamics CRM 4.0 SDK概述
Chapter 1. Microsoft Dynamics CRM 4.0 SDK Overview(SDK概述) You are probably reading this book because ...
- 【转】Android真机抓屏- Android Screen Monitor
http://www.cnblogs.com/xiaofeixiang/p/4086092.html 一般运行Android应用程序有两种方式一种是设置Android虚拟设备模拟器,通过Android ...