【问题标题】:Duplicates in database数据库中的重复项
【发布时间】:2019-03-28 19:31:02
【问题描述】:

我将 vs2017 与 entityframework 6.1.0 和 winforms 一起使用。至于实体框架,我使用代码优先。我需要制作一个电影应用程序,我已经为他们制作了所有课程MovieGenreCast(演员)。 所有Genres 都预先插入到数据库中。使用 update-database 时,会创建所有内容,包括连接表 moviegenre 和 movie cast 以及外键。当我插入一个电影对象时。它链接了流派演员和电影中的 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; }
}

当然还有我的代码(这段代码来自按钮单击事件,用于将电影添加到数据库中。):

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

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

【问题讨论】:

  • 你又在创建流派,你想在电影添加中创建流派吗?还是所有的基因都已经创建了?
  • 插入电影时,不要创建新的流派对象,而是从流派表中查询流派列表,并将该列表分配给 Movie.Genre。
  • 是的,流派已预先插入到数据库中。所以我将 _context.genres.tolist() 放入 alistbox。我从该特定电影中选择流派并将它们放在另一个列表框中,然后从第二个列表框创建列表

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


【解决方案1】:

您的问题是因为您正在再次创建 Genres,并且每次添加新电影并且您拥有身份密钥时都会再次创建,因此不会抛出异常。

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

【讨论】:

    【解决方案2】:

    实体框架无法确定GenreCast 是否已经存在,即使您创建了其中一个实例,其属性与数据库中存在的实例具有相同的属性。相反,您需要从数据库中获取现有的流派和演员并应用它们。并且只创建一个新的实例,如果它是一个全新的流派或演员,而不是在数据库中:

    伪代码:

    SaveMovie(Movie movie)
    {
        var existingGenres = GetGenresFromDatabase();
        var movieGenres = GetGenresFromListBox();
    
        foreach (var genre in movieGenres)
        {
            if (genre in existingGenres)
            {
                existingGenre = existingGenres.Where(genreId = genre.Id);
                movie.Genres.Add(existingGenre)
            }
            else 
            {
                movies.Add(genre)
            }
        }
    
        dbcontext.Add(movie);
        dbcontext.SaveChanges();
    }
    

    【讨论】:

    • Won't Where 返回一个不适合添加的 IQueryable,它旨在添加单个实体?
    • @mami 可能,这就是为什么我将其命名为“伪代码”:-)。理想情况下,您可能会寻找 FirstOrDefaultAsync 之类的东西,或者甚至制作一种单独的方法来获取现有类型。
    • 插入是异步的,以防万一。但 thx 两者都可以工作。我在 asp.net mvc 和 mvvm 中制作了这个项目,但我不知道这里出了什么问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多