EF:将记录插入M:N表无法复制键值

时间:2016-05-03 18:04:19

标签: c# entity-framework-6

我有两个模型FilmRating在数据库中反映为具有相同名称的表,它们都具有Guid ID并且通过FilmRating表相互关联(没有模特)。

为了生成FilmRating表,我在每个模型列表中引用了另一个,例如。 List<Film> RatedFilmsList<Rating> Ratings

当我尝试将记录添加到Rating表时,问题就出现了,这也会将记录添加到FilmRating表中。我有以下代码:

 public void AddNewRating(Rating newRating, Film ratedFilm)
    {
        // Add rated film to the rating collection
        if(newRating.RatedFilms == null)
        {
            newRating.RatedFilms = new List<Film>();
        }

        newRating.RatedFilms.Add(ratedFilm);          

        using (var context = new IW5Context())
        {
            context.Ratings.Add(newRating);
            context.SaveChanges();
        }
    }

ratedFilm是从数据库中检索的对象,表示评级应该与之相关的电影。 IW5Context只是继承DbContext的类。

它说:

  

{&#34;违反PRIMARY KEY约束&#39; PK_dbo.Film&#39;。无法在对象&#39; dbo.Film&#39;中插入重复键。重复键值为(5fd7ab30-b681-46d5-b34b-64afe0d1cfcb)。\ r \ n语句已终止。&#34;}

根据我的理解,它试图将胶片插入数据库,而我希望它只是将记录添加到评级表和FilmRating表(并且可能检查胶片是否存在于胶片表中)。

我该怎么办才能让它发挥作用?

编辑 - 添加电影&amp;评级模型:

public class Rating : BaseObject
{
    public double RatingValue { get; set; }

    public string TextRating { get; set; }

    public DateTime TimeAdded;

    public List<Film> RatedFilms { get; set; }

}  
public class Film : BaseObject
{
...


  public List<Rating> Ratings
    {
        get; set;
    }
}

Id列是Guid的类型,并从string Name继承(与BaseObject一起)。

AddNewRating通过从ICommand实现方法调用的方法从另一个项目调用(但被调用)。

1 个答案:

答案 0 :(得分:1)

如果您确定传递的Film是现有实体,那么您应该使用DbSet<TEntity>.Attach方法让EF不要尝试将其插入数据库中:

using (var context = new IW5Context())
{
    context.Films.Attach(ratedFilm);
    context.Ratings.Add(newRating);
    context.SaveChanges();
}