簡単です。 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;
回避策も許容されます。非定数/非エンティティ値に対してエンティティをクエリする方法が必要です。
EF Code Firstアプローチではビューを作成できません。ビューを作成する場合は、Seed
メソッドで作成SQLスクリプトを実行します。ただし、ビューと同じ名前のテーブルを作成およびドロップしてモデルをハッキングする場合を除き、エンティティをこのビューにマップすることはできません。
役立つリンク:
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が答えで話していたようなテーブルマッピングとして作成しますが、Niceであるすべてのコードを実行します。ただし、インデックスと順序を変更することをお勧めします。
次に、Up
でSql(@"YOUR VIEW CREATE SQL HERE")
を呼び出し、Down
でSql(@"DROP STATEMENT HERE")
を追加します。
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>();
...
}
(上記はすべてテストされていません)