【问题标题】:CRUD Operation with EntityFramework and MVC 5使用 EntityFramework 和 MVC 5 进行 CRUD 操作
【发布时间】:2014-06-06 17:19:31
【问题描述】:

我对 EntityFramework、ASP.NET 和 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 语句与 FOREIGN KEY 约束“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 及其相应的 View 设置(来自我之前在教程中所做的步骤)。

除了麦的回答:

本文也包含有用的帮助,尤其是在添加迁移和更新数据库部分。

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

【问题讨论】:

  • 尝试删除数据库并重新生成它。我怀疑在你修改之前已经插入了数据

标签: c# asp.net-mvc entity-framework asp.net-mvc-5


【解决方案1】:

您的 OnModelCreating 中的以下内容表明,电影中需要 Actor

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多