在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 ...
随机推荐
- Developer Tools(开发工具)
Google提供了使用Java和Python开发App Engine的免费工具.你可以从Google的网站上下载你所用语言和操作系统的软件开发包.Java用户可以以Eclipse集成开发环境的方式获取 ...
- 视频资源下载方法[download video resources]
笔者做视频时钟分析,需要用到大量特殊的视频,如何获取需要的视频是一个问题? 以下载NBA视频为例: Tools:①腾讯视频软件 (自行下载) ②批处理文件(下文会给出代码) convert.bat ...
- 【移动开发】安卓Lab2(01)
本次Lab需要用到Google Map的API,分享学习一下Google Map的知识 需求: 界面: 1. 主界面(map界面): 提供了指定的学校校园地图图片,不能用Google的API生成图片 ...
- 第二百七十九天 how can I 坚持
竟然说我是猪,也是有点受不了了.其实也没什么,无所谓. 一个人有了信仰,不管成不成功,至少不会迷茫. sql语句,left on and 和where,left on是先检索,再关联,主表是完整 ...
- iOS学习之触摸事件
触摸事件 iOS中的事件: 在用户使用app过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: view的触摸事件处理: 响应者对象: 在iOS中不是任何对象都能处理事件,只有继承了UIR ...
- C#简单应用spring的例子
接口定义 namespace SpringDemo { interface IOper { void Say(); } } 此接口的两个实现 实现1 using System; namespace S ...
- CodeForces 589B Layer Cake (暴力)
题意:给定 n 个矩形是a*b的,问你把每一块都分成一样的,然后全放一块,高度都是1,体积最大是多少. 析:这个题,当时并没有完全读懂题意,而且也不怎么会做,没想到就是一个暴力,先排序,先从大的开始选 ...
- C++库研究笔记——操作符重载实现类型转换&这样做的意义
目标: 已知这个接口: std::vector<double> add_vec(double *d1, double *d2) { ..... return result; } 我们自定义 ...
- UML图示
来源: http://www.uml.org.cn/oobject/200901041.asp 近些天学习设计.由于没有具体项目,原有项目也没有什么设计的概念,只是看相关的书籍,所以着实有些抓狂.然最 ...
- C++为什么不支持某些东西
1.学习C++的过程,经常发现C++不支持一些东西,思考下,为什么? 2.C++不支持一些东西,有两个原因: a.可以做到,但是会导致一些不合理的结果,这些结果往往与程序员的期望不一致. b.属于“臣 ...