繁体   English   中英

如何使用EF代码优先POCO创建视图

[英]How to create a view using EF code-first POCO

那么简单。 我需要使用Code First创建一个View 我在Google和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

这为您提供了一个可以手动修改的空迁移脚本。

您可以使用db上下文在迁移脚本中执行代码

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在他的答案中谈论的表映射,但会为你做所有代码,这很好。 您可能想要更改索引和排序。

然后在你的Up调用Sql(@"YOUR VIEW CREATE SQL HERE")并在你的Down添加一个Sql(@"DROP STATEMENT HERE")

您无法使用EF Code First方法创建视图。 如果要创建视图,则在Seed方法中执行创建sql脚本。 但是你仍然无法将实体映射到这个视图,除了通过创建和删除与视图同名的表来破解模型。

一些有用的链接:

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) 显然,您可以让迁移过程忽略某些dbsets

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  if (IsMigration)
    modelBuilder.Ignore<YourViewTable>();
 ...
}

(以上所有均未经测试)

您无法从EF Code First创建视图,您应该在“种子”脚本中添加脚本以预先填充视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM