数据库中的重复项

时间:2019-03-28 19:31:02

标签: c# .net winforms entity-framework-6

我正在将vs2017与entityframework 6.1.0和winforms一起使用。至于实体框架,我使用代码优先。我需要制作一个电影应用程序,为他们MovieGenreCast(演员)创建了所有类。 所有Genres已预先插入数据库中。使用更新数据库时,将创建所有内容,包括联接表moviegenre和moviecast,以及外键。当我插入电影对象时。它链接了流派演员和电影的ID,但同时也重新插入了每种流派,这意味着我重复了。我只想要链接。到目前为止,这是我的代码。

电影课:

public class Movie
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]       
    public int MovieId { get; set; }

    [Required]
    [StringLength(255)]
    public string Name { get; set; }

    //[ForeignKey("GenreId")]
    public virtual List<Genre> Genre { get; set; }

    //[ForeignKey("CastId")]
    public virtual List<Cast> cast { get; set; }

    [Required]    
    public int GenreId { get; set; }

    [Required]      
    public int CastId { get; set; }

    [Display(Name = "Release Date")]
    public DateTime ReleaseDate { get; set; }

    public Movie()
    {
        Genre = new List<Genre>();
        cast = new List<Cast>();
    }
}

类型和演员(两个类都相同)

public class Genre
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]       
    public int GenreId { get; set; }

    [Required]
    [StringLength(255)]
    public string Name { get; set; }

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

当然还有我的代码(这段代码是通过按钮click事件将影片添加到数据库中的。):

private void btnAddMovie_Click(object sender, EventArgs e)
{
    List<Genre> genrelist = new List<Genre>();
    List<Cast> castlist = new List<Cast>();

    var movie = new Movie();                       


    movie.Name = txtTitle.Text;
    movie.ReleaseDate = released;

    //creating lists
    foreach (string item in lbgenre2.Items)
    {
        var genre = new Genre();
        genre.Name = item;
        genrelist.Add(genre);
    }

    foreach (string item in lbCast2.Items)
    {
        var cast = new Cast();
        cast.Name = item;
        castlist.Add(cast);

    }

    movie.Genre = genrelist;
    movie.cast = castlist;


    _context.movies.Add(movie);

    Save();                        
}

private async void Save()
{
    await _context.SaveChangesAsync();
}

链接并重新插入它在做什么错了?

2 个答案:

答案 0 :(得分:1)

您的问题是,因为您要再次创建流派,并且每次添加新电影并拥有一个身份密钥时都必须再次创建,所以不会抛出异常。

foreach (string item in lbgenre2.Items)
{
    //Here is your problem, you are creating a new Genere instead of using the already created
    var genre = new Genre();
    genre.Name = item;        
    genrelist.Add(genre);
}

因此,不要创建,而是使用ef获取现有的

foreach (string item in lbgenre2.Items)
{
    //try to get the genere from database
    var genre = _context.generes.FirstOrDefault(x => x.Name == item);    
    //if it doesn't exist..
    if(genre == null)
    {
        //Create it 
        genre = new Genre();
        //And set the name
        genre.Name = item;            
    }
    //but, if it already exist, you dont create a new one, just use the existing one
    genrelist.Add(genre);
}

答案 1 :(得分:1)

实体框架无法确定J2EEGenre是否已经存在,即使您为其中之一创建了实例,并且其属性与数据库中存在的属性相同。相反,您需要获取现有类型并从数据库中进行转换并应用它们。如果数据库是不在数据库中的全新流派或演员,则仅创建一个新实例:

伪代码:

Cast