就这么简单。我需要使用 Code First创建一个视图。我在谷歌和 SO 上都没有发现任何关于这个的信息。有没有办法做到这一点?
我需要使用 linq 创建和查询该视图,因此它不是使用数据库创建脚本创建它的解决方案,例如:
var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;
解决方法也是可以接受的。我需要一种针对非常量/非实体值查询实体的方法。
就这么简单。我需要使用 Code First创建一个视图。我在谷歌和 SO 上都没有发现任何关于这个的信息。有没有办法做到这一点?
我需要使用 linq 创建和查询该视图,因此它不是使用数据库创建脚本创建它的解决方案,例如:
var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;
解决方法也是可以接受的。我需要一种针对非常量/非实体值查询实体的方法。
您必须手动创建视图,就像 AnatoliiG 所说的那样。(向表中添加索引)。
您将视图的名称作为属性添加到您的类
[Table("UserDTO")]
public class UserDTO
{
/* Class code here */
}
您可以通过在末尾指定 -IgnoreChanges 属性来创建空迁移
Add-Migration MigrationName -IgnoreChanges
这为您提供了一个可以手动修改的空迁移脚本。
您可以使用您的数据库上下文在迁移脚本中执行您的代码
public partial class editUserDTO : DbMigration
{
public override void Up()
{
string script =
@"
CREATE VIEW dbo.UserDTO
AS SELECT p.PersonId AS UserId, p.FirstName, p.LastName, u.UserName
FROM dbo.Users u
INNER JOIN dbo.People p ON u.PersonId = p.PersonId";
BloggingContext ctx = new BloggingContext();
ctx.Database.ExecuteSqlCommand(script);
}
public override void Down()
{
BloggingContext ctx = new BloggingContext();
ctx.Database.ExecuteSqlCommand("DROP VIEW dbo.UserDTO");
}
}
只是提醒一下,在 EF 6.1 中(不确定是否更早)现在有一个Code First from Database
选项可供您使用,它也将映射到视图。
我个人在一个单独的垃圾项目中拥有我的,所以我可以从中取出我想要的代码,而不会影响我实际使用数据库的项目。使用它Add a New file to your project -> Data -> ADO.NET Entity Data Model
然后选择该Code First From Database
选项并选择您的视图(如果需要,还可以选择其他表格)
它将像 Fred 在他的回答中所说的那样将其创建为表映射,但会为您完成所有代码,这很好。不过,您可能希望更改索引和排序。
然后只需打电话给Sql(@"YOUR VIEW CREATE SQL HERE")
你Up
并Sql(@"DROP STATEMENT HERE")
在你的Down
来自EF7的官方问题线程的很多很好的见解:
1)没有 DbSet,而是有一个属性或扩展方法
A) 财产
class YourContext
{
public IQueryable<YourView> YourView
{
get
{
return this.Database.SqlQuery<YourView>("select * from dbo.YourView");
}
}
}
B) 扩展方法
static class YourContextExtensions
{
public static IQueryable<YourView>(this YourContext context)
{
return context.Database.SqlQuery<YourView>("select * from dbo.YourView");
}
2)显然,您可以让迁移过程忽略某些数据库集
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
if (IsMigration)
modelBuilder.Ignore<YourViewTable>();
...
}
(以上都是未经测试的)
您无法使用 EF Code First 方法创建视图。如果要创建视图,请在Seed
方法中执行创建 sql 脚本。但是您仍然无法将实体映射到此视图,除非通过创建和删除与您的视图具有相同名称的表来破解模型。
一些有用的链接:
您不能从 EF Code First 创建视图,您应该在“种子”脚本中添加脚本以预填充视图。