在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 ...
随机推荐
- ubuntu使用问题与解决记录[持续更新]
1. 添加到计划任务 为脚本增加可执行权限 sudo chmod +x yeelink.sh 将脚本加入cronjob(计划任务) sudo crontab -e 在cornjob文件中添加下面一行, ...
- 一条scan查询把HBase集群干趴下
最近在给公司搭建CDH集群,在测试集群性能时,写了一条简单的scan查询语句竟然把hbase集群的所有regionserver干趴下了.这让我云里雾里的飘飘然. 背景介绍 CDH集群,2台主节点.3台 ...
- Apache Spark GraphX的简介
简单地说,GraphX是大规模图计算框架. GraphX 是 Spark 中的一个重要子项目,它利用 Spark 作为计算引擎,实现了大规模图计算的功能,并提供了类似 Pregel 的编程接口. Gr ...
- Android问题-新电脑新系统WIN764位上安装简版本的XE8提示“Unit not found: 'System'”
问题现象:电脑太慢,重安新系统,所以要安DELPHIXE8,但安装过程中出现二次杀软件提示,我都选的是通过.但是XE8过程到最后的"Create AVD"时出现一个错误(具体是什么 ...
- CodeForces 682E Alyona and Triangles (计算几何)
Alyona and Triangles 题目连接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/J Description You ar ...
- srcelement、parentElement
srcElement 是Dom事件中的事件最初指派到的元素. 比如有一个div,里面有一个按钮.你响应div的onclick事件,但实际上,你单击的只是它内部的按钮,那么,srcElement指向的, ...
- java封装对象转json字符串
/** * Copyright (c) 2011-2015, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License ...
- DllImport属性详解
API函数是构筑Windows的基石, 是Windows编程的必备利器.每一种Windows应用程序开发工具都提供间接或者直接的方式调用Win32API,C#也不例外.使用Win32API的一个好处就 ...
- 关于mysql_fetch_****
今天调试如下代码: mysql_select_db('content',$link);//选择数据库 mysql_query("set names utf8");//设置编码格式 ...
- twisted 安装时,安装顺序为 zope.interface ->twisted
最近想学 twisted ,就去下载 twisted 的windows版本,并且 安装.运行 twisted 例子后,发现出现了问题: ImportError: Twisted requires zo ...