簡體   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