48

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

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

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

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

4

5 に答える 5

87

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");
    }
}
于 2013-09-09T21:35:46.943 に答える
12

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

役立つリンク:

于 2012-11-27T22:22:54.500 に答える