2016-01-07 16 views
7

Tôi đang làm việc với dự án đầu tiên của tôi bằng Entity Framework 7 và đang kết nối với một Máy chủ SQL nơi Cơ sở dữ liệu đã được tạo nhưng chưa có bảng nào trong đó. Tôi đã tạo DbContext và tạo một lớp học, sau đó đặt DbSet<> trong ngữ cảnh của tôi. Tôi chạy các lệnh để cho phép di chuyển và tạo di chuyển đầu tiên, sau đó rand lệnh để cập nhật cơ sở dữ liệu. Mọi thứ trông có vẻ ổn, không có lỗi nào xảy ra, nhưng khi tôi nhìn vào cơ sở dữ liệu chỉ có bảng EFMigraitonsHistory được tạo. Khi tôi nhìn vào lớp đã được tạo cho lần di chuyển ban đầu, nó cơ bản là trống. Tôi đang làm gì sai?Entity Framework 7 di chuyển không tạo bảng

Commands Tôi đang chạy:

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

Bối cảnh:

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

Bảng Class:

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"]); 
       }); 
    } 

Class cho di chuyển ban đầu (autogenerated bởi EF):

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

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

Edit: Sau khi thực hiện những gì Poke đã gợi ý này là di cư autogenerated mới của tôi. Bảng này vẫn chưa được tạo ra ở cấp cơ sở dữ liệu.

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"); 
     } 
    } 
} 

Trả lời

14

Trước tiên, bạn cần phải thiết lập thực thể trong bối cảnh cơ sở dữ liệu của mình. Ít nhất, bạn sẽ cần phải làm điều này:

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

    modelBuilder.Entity<NavigationMenu>(); 
} 

Vấn đề với di cư của bạn là một chút ẩn trong bố trí dự án của bạn. Vì vậy, những gì bạn có là một dự án JobSight.DAL có chứa các thực thể và bối cảnh cơ sở dữ liệu. Và sau đó bạn có một dự án JobSight.WebUI là dự án ASP thực tế có chứa Startup.cs với thiết lập cơ sở dữ liệu.

Điều này đang gây ra sự cố vì theo mặc định, EF sẽ giả định tìm mọi thứ trong hội đồng hiện tại. Vì vậy, nếu bạn đang khởi chạy lệnh ef từ dự án web của bạn, nó sẽ tạo ra các di chuyển trong đó ngay cả khi ngữ cảnh nằm trong một dự án khác. Nhưng khi bạn đang cố gắng áp dụng di chuyển, EF sẽ không tìm thấy nó vì nó sẽ chỉ nhìn vào dự án của ngữ cảnh.

Vì vậy, để khắc phục điều này, bạn cần tạo các di chuyển trong dự án DAL. Bạn có thể làm điều đó bằng cách xác định dự án khi bạn gọi ef lệnh:

dnx ef migrations add Example -p JobSight.DAL 

Bạn có thể xác minh rằng điều này làm việc bằng cách chạy dnx ef migrations list sau đó. Điều này sẽ trả lại di chuyển Example; trước đó, lệnh đó không trả về bất cứ điều gì: Nó không thể tìm thấy di chuyển, đó là lý do tại sao lệnh update chỉ cho biết Done (mà không áp dụng di chuyển) và cơ sở dữ liệu không được tạo.Vì vậy, nếu bây giờ bạn có được sự di cư ở đó, sau đó bạn có thể áp dụng nó bằng cách sử:

dnx ef database update 

Lưu ý rằng kể từ khi di cư hiện nay được tạo ra trong dự án Dal, bạn cần phải thêm một tham chiếu đến EntityFramework.MicrosoftSqlServer có, nếu không dự án sẽ không biên dịch. Bạn cần thực hiện điều đó trước khi có thể chạy lệnh list ở trên.

Cuối cùng, để biết thêm thông tin về điều này, hãy xem this issue.

+0

Tôi đã thêm mã ghi đè vào ngữ cảnh của mình và giờ đây lớp di chuyển không có mã để tạo bảng nhưng khi chạy lệnh cập nhật, nó vẫn không tạo bảng của tôi. Tôi đã cập nhật bài đăng gốc bằng các lệnh tôi đang chạy để thực hiện việc này. – Matthew

+0

Liệu bản cập nhật cơ sở dữ liệu 'ef' có trả về bất kỳ đầu ra nào không? Bạn có chắc là bạn đang xem xét cơ sở dữ liệu chính xác không? Kiểm tra chuỗi kết nối của bạn để đảm bảo những gì bạn đang làm việc. – poke

+0

Tôi chắc chắn đó là DB đúng. Tôi có thể xóa bảng EFMigrationHistory và nó được tái tạo, cộng với nó là chỉ có DB trên máy chủ. Khi tôi chạy lệnh 'dnx ef database update', tất cả những gì nó làm là ngồi đó rồi nói' done'. Tôi có phải làm điều gì đó đặc biệt vì DB đã tồn tại không có bất kỳ bảng nào không? – Matthew

1

Mặc dù đây không phải là câu trả lời cho câu hỏi ban đầu, tôi đăng câu trả lời của tôi ở đây vì nó có thể giúp một người có vấn đề tương tự. Vấn đề của tôi cũng là các bảng không được tạo, nhưng dotnet ef migrations add InitialCreate đã tạo 3 tệp .cs trong thư mục Di chuyển. Nhưng dotnet ef database update chỉ tạo bảng MigrationsHistory và dotnet ef migrations list không trả lại bất kỳ di chuyển nào.

Hóa ra là sự cố là thư mục Di chuyển đã bị loại trừ khỏi dự án Visual Studio. Khi tôi đưa nó lại, mọi thứ đều ổn.

Các vấn đề liên quan