在模型中声明列表属性并使用种子方法填充它的最佳方法

时间:2016-04-05 21:16:47

标签: c# entity-framework visual-studio

我创建了一个简单的电影应用,它将显示一系列电影,并且会有一个可以编辑电影信息的管理面板。我已经为演员和电影表创建了我的模型,但我很难找出宣布电影类型属性的最佳方式。

基本上我的问题是双重的,因为我不确定Genre是否应该是自己的链接到电影表的表,或者是否应该将其声明为列表。简单来说,这个:

public class Movie
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MovieId { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public Rating? Rating { get; set; }
    public int Ranking { get; set; }

    public virtual IList<Genre> Genres { get; set; }
    public virtual IEnumerable<Actor> Actors { get; set; }
}

或者这个:

    public class Movie
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MovieId { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public IList<string> Genre { get; set; } 
    public Rating? Rating { get; set; }
    public int Ranking { get; set; }

    public virtual IEnumerable<Actor> Actors { get; set; }
}

...以及在创建影片对象时如何在种子方法中填充它。

var movies = new List<Movie>
        {
            new Movie {Title = "Pineapple Express", ReleaseDate = DateTime.Parse("2008-08-06"), Rating = Rating.R},
            new Movie {Title = "American Hustle", ReleaseDate = DateTime.Parse("2013-12-13"), Rating = Rating.R},
            new Movie {Title = "40 Year Old Virgin", ReleaseDate = DateTime.Parse("2005-08-09"), Rating = Rating.R},
            new Movie {Title = "Ant Man", ReleaseDate = DateTime.Parse("2015-07-09"), Rating = Rating.PG13},
            new Movie {Title = "This Is The End", ReleaseDate = DateTime.Parse("2013-06-12"), Rating = Rating.R},
            new Movie {Title = "Anchorman: The Legend of Ron Burgundy", ReleaseDate = DateTime.Parse("2004-07-09"), Rating = Rating.R}
        };

        movies.ForEach(m => context.Movies.Add(m));
        context.SaveChanges();

我尝试上网,但我很难找到包含适合我的例子的列表的模型示例(或者我可能不确定如何查找它?)。非常感谢任何帮助或指导。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以将类型声明为枚举。这将使您无法为类型创建新表。您可以在单独的Genres.cs文件中将枚举声明为以下内容:

  namespace Movies.Models
{
    public enum Genres
    {
        Horror = 0,
        Action = 1,
        Comedy = 2,
        Thriller = 3,
        //Add whatever genres here 
    }
}

现在您将使用种子中的枚举,而不是在模型属性中保留字符串列表属性,因此这将是您的模型:

   public class Movie
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MovieId { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public IList<string> Genre { get; set; } 
    public Rating? Rating { get; set; }
    public int Ranking { get; set; }

    public virtual IEnumerable<Actor> Actors { get; set; }
}

播种方法如下所示:

var movies = new List<Movie>
        {
            new Movie {Title = "Pineapple Express", ReleaseDate = DateTime.Parse("2008-08-06"), Rating = Rating.R,Genre.Add(Genres.Action.ToString())}//You can use AddRange to add more than one genre
        };

        movies.ForEach(m => context.Movies.Add(m));
        context.SaveChanges();

你必须尽可能地使你的枚举成为一般,添加所有类型并选择你需要的电影。

如果你打算让这个更流畅和更通用,你将不得不为一对多的关系制作一个表格

答案 1 :(得分:0)

我认为您在评论中已回答了自己的问题。如果您要允许用户编辑/添加该类型的条目,则应该是一个表格。

如果您为每部电影配备多种类型,您可能还需要另一个交叉引用表来保存MovieId和GenreId。然后,您可以查找与电影相关的所有类型。