web-dev-qa-db-ja.com

Entity Framework Coreが既存のデータベースからモデルを作成

Entity Framework Coreでは、EFモデルとエンティティをどのように生成しますか?

ASP.NET Core-Existing Database Microsoftの記事によると、パッケージマネージャーコンソールで次のようなコマンドを実行する必要があります。

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

これにより、インポートするテーブルまたはビューをまったく制御できなくなります。これがデータベースをリバースエンジニアリングし、EF CoreでEFモデルとエンティティを作成する唯一の方法であり、これが完全なEntity Frameworkで何年も行われていた方法と比較した場合、その進捗はどうですか?

19
Dean Kuga

Entity Framework Coreでこれを行う方法はありません。こちらのドキュメントをご覧ください: https://docs.Microsoft.com/en-us/ef/efcore-and-ef6/features

8
Sol W

私はこの質問が少し古いことを知っていますが、同じ問題につまずく人々にとってはかなり役に立つと思います。

あなたの質問を正しく理解できたら、どのテーブルを生成するかを指定します。コマンドに-Tablesパラメーターを追加すると可能になります。

データベースの3つのテーブルを生成するために使用したコマンドは次のとおりです(パッケージマネージャーコンソールで)。

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=DatabaseName;Trusted_Connection=True;"  
     -Provider Microsoft.EntityFrameworkCore.SqlServer 
     -OutputDir Models -Context NorthwndContext 
     -Tables Products,Categories,Suppliers -Force

ご覧のとおり、私はNorthwnd-Databaseを使用し、「Products、Categories、およびSupplier」テーブルのみを生成します。明らかに、さらにテーブルを追加できます。コンマで区切るだけです。

わからない場合は、データ接続(サーバーエクスプローラー)に移動してDatabaseNameを取得し、追加するデータベースをクリックして、右側(プロパティ)にプロパティ(名前)が表示されます。私にとっては「NORTHWND.MDF」でした。

-Forceを使用して、既に作成したモデルをオーバーライドしました。

-DataAnnotationsを使用して、注釈付きモデルを取得できます。それ以外の場合は、Fluentモデル構成を取得します。

PS:ASP.NET Core 2とEntity Framework Core 2.0.0でのみこれを試しました。

48
HiHo

私の状況では、DbContextsを含む.net 4.5+クラスライブラリがありました。

これらのDbContextは、「既存のデータベースから最初にコードを作成」ウィザードを使用して、既存のDBから作成されていました。このWizardはEF Coreにないようです。

EF Coreと互換性のある既存のDBから新しいCode First DbContextを作成するには、ガイド here

私の手順:

  • 新しいコアクラスライブラリを作成しました

  • Nugetパッケージを追加Microsoft.EntityFrameworkCore

  • Nugetパッケージを追加Microsoft.EntityFrameworkCore.Tools
  • Nugetパッケージを追加Microsoft.EntityFrameworkCore.SqlServer
  • Nugetパッケージを追加Microsoft.EntityFrameworkCore.SqlServer.Design

  • Nuget Package Managerコンソールを開きました

  • コマンド を入力しました

    Scaffold-DbContext "data source=MYSQLDBSERVER\MYSQLINSTANCE;initial catalog=MYDB;integrated security=True;MultipleActiveResultSets=True;"
    
  • プロバイダーとして入力

    Microsoft.EntityFrameworkCore.SqlServer
    

コア以外のプロジェクトを使用すると、nuget Package Managerコンソールで問題が発生する可能性があることに注意してください。 .netの代わりに新しいコアクラスライブラリを作成するだけで、この問題を回避しました。

コンテキストを作成したら、Code Firstで通常のように編集できます。使用しないテーブルを削除できます。

5
BautaBear

詐欺師のメソッドを適用することもできます。VS2015を開き、実際のプロジェクトと同じ名前で新しいクラスライブラリを作成してから、エンティティデータモデルウィザードを実行します。

完了したら、コピーして.netコアプロジェクトに貼り付けます。結果のコードには少し調整が必要ですが、簡単です。

ただし、上記のscaffoldコマンドを実行する方がより良いソリューションです。

2
Greg Gum

Dotnetコアを使用してSqlデータベーススキーマをEFコアに変換する場合は、次の手順に従います。

すべてのコマンドを1つずつ実行します(新しいプロジェクトを作成する場合は最初のコマンド、それ以外は無視して、プロジェクトのルートフォルダーから他のコマンドを実行するだけです)

dotnet new mvc -o <ProjectName>

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design

dotnet add package Microsoft.EntityFrameworkCore.SqlServer.Design

dotnet add package Microsoft.EntityFrameworkCore.Tools

dotnet tool install --global dotnet-aspnet-codegenerator

最後に...

dotnet ef dbcontext scaffold "Server=servername\instancename;Database=My_Database;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

これにより、プロジェクトのモデルフォルダー内にdbスキーマの必要なモデルとコンテキストが作成されます。

次のコマンドを適用することで[〜#〜] crud [〜#〜]コードを簡単に生成できるようになりました。

dotnet aspnet-codegenerator controller -name <MyNewController> -m <ModelName> -dc <MyDbContext> --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries 

MyNewControllerを希望のコントローラー名で、ModelNameをターゲットにするモデルフォルダー内のモデル名で、最後にMyDbContextでシステムを変更しますModelsフォルダー内で使用可能な生成されたコンテキストファイル名

ただし、そのコマンドを実行する前に、プロジェクトフォルダー内のappsettings.jsonおよびstartup.csファイルで必要な変更を行ったことを確認してください

appsettings.json行の後に追加

「AllowedHosts」:「*」、

 "ConnectionStrings": {
    "MyDbConnection": "Server=servername\\instancename;Database=My_Database;Trusted_Connection=True;"
  }

startup.cs行の直前にファイルを追加

services.AddMvc()。SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

services.AddDbContext<SwiftRbs_LocalContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));

楽しい!!

0
Manoj Roy