web-dev-qa-db-ja.com

EFコードファーストPOCOを使用してビューを作成する方法

簡単です。 Code Firstを使用してViewを作成する必要があります。私はグーグルでもSOでもこれについて何も見つけませんでした。これを達成する方法はありますか?

このビューは、linqを使用して作成およびクエリする必要があるため、たとえば、データベース作成時にスクリプトを使用して作成することは解決策ではありません。

var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;

回避策も許容されます。非定数/非エンティティ値に対してエンティティをクエリする方法が必要です。

37
Chuck Norris

EF Code Firstアプローチではビューを作成できません。ビューを作成する場合は、Seedメソッドで作成SQLスクリプトを実行します。ただし、ビューと同じ名前のテーブルを作成およびドロップしてモデルをハッキングする場合を除き、エンティティをこのビューにマップすることはできません。

役立つリンク:

11
Anatolii Gabuza

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");
    }
}
64
Fred

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が答えで話していたようなテーブルマッピングとして作成しますが、Niceであるすべてのコードを実行します。ただし、インデックスと順序を変更することをお勧めします。

次に、UpSql(@"YOUR VIEW CREATE SQL HERE")を呼び出し、DownSql(@"DROP STATEMENT HERE")を追加します。

18
John

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>();
 ...
}

(上記はすべてテストされていません)

10
Todd