2014-06-06 38 views
1

CRUD操作我是比較新的的EntityFramework,ASP.NET MVC和5用的EntityFramework和MVC 5

被跟隨從這裏http://www.asp.net/mvc/tutorials/mvc-5/introduction/getting-started

教程,我想通過增加單把它擴大Movie-Actor的多對多關係(這是一個演員可以在許多電影中)。

因此,我在我的模型文件夾中有這些代碼:

Actor.cs

namespace MvcMovie.Models 
{ 
    public class Actor 
    { 
     public int ActorId { get; set; } 
     public String FirstName { get; set; } 
     public String Address { get; set; } 

     public ICollection<Movie> Movies { get; set; } 
    } 
} 

Movie.cs

namespace MvcMovie.Models 
{ 
    public class Movie 
    { 
     public int ID { get; set; } 

     [StringLength(60, MinimumLength = 3)] 
     public string Title { get; set; } 

     [Display(Name = "Release Date")] 
     [DataType(DataType.Date)] 
     [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
     public DateTime ReleaseDate { get; set; } 

     [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] 
     [Required] 
     [StringLength(30)] 
     public string Genre { get; set; } 

     [Range(1, 100)] 
     [DataType(DataType.Currency)] 
     public decimal Price { get; set; } 

     [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] 
     [StringLength(5)] 
     public string Rating { get; set; } 

     public int ActorId { get; set;} 
     public Actor Actor { get; set; } 
    } 
} 

MovieDBContext.cs

namespace MvcMovie.Models 
{ 
    public class MovieDBContext : DbContext 
    { 
     public DbSet<Actor> Actors { get; set; } 
     public DbSet<Movie> Movies { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Actor>().HasKey(p => p.ActorId); 
      modelBuilder.Entity<Actor>().Property(c => c.ActorId) 
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

      modelBuilder.Entity<Movie>().HasKey(m => m.ID); 
      modelBuilder.Entity<Movie>().Property(m => m.ID) 
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

      modelBuilder.Entity<Movie>().HasRequired(p => p.Actor) 
       .WithMany(m => m.Movies) 
       .HasForeignKey(m => m.ActorId); 
      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

然後我就包管理器嘗試以下命令

PM> Add-Migration ActorTable 
PM> Update-Database 

並得到以下錯誤: ALTER TABLE語句衝突與外鍵約束「FK_dbo.Movies_dbo.Actors_ActorId」。衝突發生在數據庫「MOVIES_bd6a468e283a4100b6021adaf9911f7d」,表「dbo.Actors」,列'ActorId'中。

我有一種感覺,它已經得到的東西與我的數據種子做的(內部configuration.cs文件)

protected override void Seed(MvcMovie.Models.MovieDBContext context) 
     { 
      context.Movies.AddOrUpdate(i => i.Title, 
       new Movie 
       { 
        Title = "When Harry Met Sally", 
        ReleaseDate = DateTime.Parse("1989-1-11"), 
        Genre = "Romantic Comedy", 
        Rating = "PG", 
        Price = 7.99M 
       }, 

     } 

有人建議我到正確的方向。謝謝

ps:我有MovieController及其相應的視圖設置(從我做的教程中顯示的前面的步驟)。

除了麥的回答是:

本文包含有用的幫助爲好,特別是在添加遷移和更新數據庫部分。

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

+0

嘗試刪除數據庫並重新生成它。我懷疑在修改之前已經插入了數據 –

回答

1

繼在您OnModelCreating行說,演員在電影

modelBuilder.Entity<Movie>().HasRequired(p => p.Actor) 
      .WithMany(m => m.Movies) 
      .HasForeignKey(m => m.ActorId); 

需要成功更新數據庫,你可以改變你的種子的方法是這樣的:

context.Movies.AddOrUpdate(i => i.Title, 
      new Movie 
      { 
       Title = "When Harry Met Sally", 
       ReleaseDate = DateTime.Parse("1989-1-11"), 
       Genre = "Romantic Comedy", 
       Rating = "PG", 
       Price = 7.99M, 
       Actor = new Actor() { FirstName = "Actor1", Address = "Address1"} 
      }); 

希望這有助於。

+0

感謝它的使用。 – Jeremy