在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: 18, scale: 2),
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中使用数据库里的视图,布布扣,bubuko.com

时间: 2024-12-23 01:23:35

在Code first中使用数据库里的视图的相关文章

android在sqlite数据库的SQLiteOpenHelper中的onUpgrade里判断表是否存在

private boolean tabbleIsExist(String tableName, SQLiteDatabase db) { LogUtils.d("DatabaseHelper", "checking tabbleIsExist " + tableName); boolean result = false; if (tableName == null) { return false; } Cursor cursor = null; try { Stri

PHP中的数据库二、memcache

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

EF 中 Code First 的数据迁移以及创建视图

写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功),我摸索出了一种简单有效的方法,这里分享给大家. EF是Entity Framework(实体框架)的简写,是微软出品的用来操作数据库的一个框架,会ASP.NET MVC的朋友对他肯定都不陌生.由于学艺不精,我对EF存在一疑虑,就不以[提问]的方式来问了,我以[总结]的方式来表达,如果总结有误的地

C#在listview控件中显示数据库数据

一.了解listview控件的属性 view:设置为details columns:设置列 items:设置行 1.将listview的view设置为details 2.设置列属性 点击添加,添加一列 设置一列的Text属性,这就是列名 添加三列 3.编辑items属性,添加一行数据 编辑Text属性,添加一行的第一个数据 编辑subitems属性,添加一行中的其他数据 添加两个数据 填写结果 二.在listview中显示数据库数据 //在listview中显示数据库数据 private voi

0537-实战将lnmp服务中的数据库独立分离到服务器

前面安装的nginx和php,mysqld的服务要加入开机自启动,加入方法如下: vi /etc/rc.local添加如下内容为开机自启动 [[email protected] extra]# vi /etc/rc.local 追加到/etc/rc.local文件最后面 #### /application/nginx/sbin/nginx /application/php/sbin/php-fpm /etc/init.d/mysqld start 备份所有库(不需要备份所有库只需要备份wordp

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添加一个User类: namespace MyFirstApp.Models { public class User { public int ID { get; set; } public string Name { get; set; } public string Email { get; se

Entity Framework 6.x - Code First 默认创建数据库的位置

在集成DbContext的派生类中的构造函数里,如果没有指定配置文件中的数据库连接字符串的name,默认就是: Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=ConsoleApplication4.EF6RecipesEntities;Integrated Security=True 注:数据库名称是ConsoleApplication4.EF6RecipesEntities

求代码:android listview checkbox 从数据库里读取数据后怎么设置相应的checkbox为选中状态

============问题描述============ 现在有一个android listview 带checkbox,从数据库里调取相应数据后,绑定到listview 上. 那么怎么将listview 里的checkbox的选择状态与在数据库中记录一一对应? 求给出代码. 我在自定义BaseAdapter类中,getView方法中无法实现. ============解决方案1============ 这样 你点击的时候 是不是 会获取一个view  通过这个view 获取你那个 checkb

java导出数据库里的数据至Excel进行数据备份

调用部分: package com.otdrmsys.action; import com.otdrmsys.util.ResultSetToExcel; public class ExcelExport { public static void main(String[] args) { // String fileName = "otdr";//文件名,不带路径,不带.xls后缀 // String [] coloumItems = {"otdr编号",&quo