實體框架7遷移不創建表

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

我正在使用Entity Framework 7處理我的第一個項目,並且正在連接到已經創建了數據庫的SQL Server,但其中還沒有表。我創建了我的DbContext並創建了一個類,然後在我的上下文中設置了一個DbSet<> 。我運行命令以啟用遷移並創建第一次遷移,然後使用rand命令更新數據庫。一切看起來都很好,沒有出現錯誤,但是當我查看數據庫時,只創建了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)
        {
        }
    }
}

編輯:在做了Poke的建議後,這是我新的自動生成的遷移。但是,該表仍未在數據庫級別創建。

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來驗證這dnx ef migrations list 。現在應該返回Example遷移;以前,該命令沒有返回任何內容:它無法找到遷移,這就是update命令僅表示Done (未應用遷移)並且未創建數據庫的原因。因此,如果您現在可以在那裡進行遷移,則可以使用以下方法應用它:

dnx ef database update

請注意,由於現在在DAL項目中創建了遷移,因此需要在那裡添加對EntityFramework.MicrosoftSqlServer的引用,否則項目將無法編譯。您需要先執行此操作,然後才能運行上面的list命令。

最後,有關此問題的更多信息,請參閱此問題


熱門答案

雖然這不是原始問題的答案,但我在這裡發布我的答案,因為它可能會幫助有類似問題的人。我的問題還在於沒有創建表,但是dotnet ef migrations add InitialCreate確實在Migrations文件夾中創建了3.cs文件。但dotnet ef database update僅創建了MigrationsHistory表,而dotnet ef migrations list未返回任何遷移。

原來,問題是Visual Studio項目中排除了Migrations文件夾。一旦我再次包含它,一切都運行良好。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因