テーブルを作成していないEntity Framework 7の移行

asp.net-core c# entity-framework-core

質問

Entity Framework 7を使用している私の最初のプロジェクトで作業していますが、データベースがすでに作成されているSQL Serverに接続していますが、まだテーブルがありません。私は私のDbContextを作成し、クラスを作成して、 DbSet<>を自分のコンテキスト内に設定しました。コマンドを実行して移行を有効にし、最初の移行を作成してから、データベースを更新するコマンドを実行します。すべて正常に動作するように見えましたが、エラーは出ませんでしたが、データベースを見ると、 EFMigraitonsHistoryテーブルのみが作成されました。最初の移行のために作成されたクラスを見ると、基本的に空白になります。私は間違って何をしていますか?

私が走っているコマンド:

dnvm install latest -r coreclr
dnx ef migrations add MyFirstMigration
dnx ef database update

コンテキスト:

namespace JobSight.DAL
{
    public class JobSightDBContext : DbContext
    {
        public DbSet<NavigationMenu> NavigationMenu { get; set; }
    }
}

テーブルクラス:

namespace JobSight.DAL
{
    public class NavigationMenu
    {
        [Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int16 ID { get; set; }

        public string ControllerName { get; set; }
        public string ActionName { get; set; }
        public string ExternalURL { get; set; }
        public string Title { get; set; }
        public Int16? ParentID { get; set; }

        public virtual NavigationMenu Parent { get; set; }
    }
}

Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<JobSightDBContext>(options =>
                {
                    options.UseSqlServer(Configuration["Data:JobSightDatabase:ConnectionString"]);
                });
    }

初期移行のクラス(EFによって自動生成):

namespace JobSight.WebUI.Migrations
{
    public partial class Initial : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
        }
    }
}

編集:ポケが提案したことをやった後、これが私の新しい自動生成マイグレーションです。しかし、テーブルは依然としてデータベースレベルで作成されていません。

namespace JobSight.WebUI.Migrations
{
    public partial class MyFirstMigration : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "NavigationMenu",
                columns: table => new
                {
                    ID = table.Column<short>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    ActionName = table.Column<string>(nullable: true),
                    ControllerName = table.Column<string>(nullable: true),
                    ExternalURL = table.Column<string>(nullable: true),
                    ParentID = table.Column<short>(nullable: true),
                    Title = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_NavigationMenu", x => x.ID);
                    table.ForeignKey(
                        name: "FK_NavigationMenu_NavigationMenu_ParentID",
                        column: x => x.ParentID,
                        principalTable: "NavigationMenu",
                        principalColumn: "ID",
                        onDelete: ReferentialAction.Restrict);
                });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable("NavigationMenu");
        }
    }
}

受け入れられた回答

まずデータベースコンテキストでエンティティを設定する必要があります。少なくとも、これを行う必要があります:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<NavigationMenu>();
}

あなたの移行に関する問題は、あなたのプロジェクトレイアウトでは少し隠されていました。ですから、エンティティとデータベースコンテキストを含むJobSight.DALプロジェクトがあります。そして、あなたは、プロジェクトの持っているJobSight.WebUI含む実際のASPプロジェクトであるStartup.csデータベースのセットアップでは。

これは問題を引き起こしています。なぜなら、デフォルトでは、EFは現在のアセンブリ内のすべてを見つけると仮定しているからです。したがって、Webプロジェクトからefコマンドを起動すると、コンテキストが別のプロジェクトにある場合でも、そこにマイグレーションが作成されます。しかし、移行を適用しようとすると、EFはそれがコンテキストのプロジェクトでしか見られないので、それを見つけることはできません。

したがって、これを修正するには、 DALプロジェクトで移行を作成する必要があります。 efコマンドを呼び出すときに、プロジェクトを指定することでそれを行うことができます:

dnx ef migrations add Example -p JobSight.DAL

dnx ef migrations list実行することで、これが機能していることを確認できます。これで、 Example移行が返されるはずです。そのコマンドは何も返さなかった:それは、 updateコマンドがDone (移行を適用せずに)とデータベースが作成されていないという理由だけである移行を見つけることができなかった。ですから、ここで移行を行ったら、次のようにして移行することができます。

dnx ef database update

DALプロジェクトでマイグレーションが作成されるため、そこにEntityFramework.MicrosoftSqlServerへの参照を追加する必要があります。そうしないと、プロジェクトはコンパイルされません。上記のlistコマンドを実行するには、その前に実行する必要があります。

最後に、これに関する詳細については、 この問題を参照してください。


人気のある回答

これは元の質問に対する答えではありませんが、同様の問題を抱えている人を助けるかもしれないので、私はここに答えを記しています。私の問題は、テーブルが作成されていなかったということもありましたが、 dotnet ef migrations add InitialCreate の移行フォルダ内に3は.csファイルを作成しました。しかし、 dotnet ef database updateでは、MigrationsHistoryテーブルのみが作成され、 dotnet ef migrations listは移行を返しませんでした。

問題はMigrationsフォルダがVisual Studioプロジェクトから除外されていることが判明しました。私は再びそれを含め、すべて正常に働いた。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ