【问题标题】:EF: Inserting record to M:N table fails dues to duplicate key valueEF:由于重复键值,将记录插入 M:N 表失败
【发布时间】:2016-05-04 02:51:46
【问题描述】:

我有两个模型 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 的类。

上面写着:

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

据我了解,它会尝试将电影插入数据库,而我希望它只会将记录添加到 Rating 表和 FilmRating 表(并可能检查 Film 表中是否存在电影)。

我应该怎么做才能让它工作?

编辑 - 添加电影和评级模型:

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 的类型,并且从 BaseObject 继承(与 string Name 一起)。

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

【问题讨论】:

  • FilmRating 看起来像什么,你怎么称呼AddNewRatingSSCCE 会很有帮助,因为现在,我们不得不猜测是什么情况导致了您的问题
  • @SamIam 我更新了答案,谢谢你的建议。
  • 我想看到的部分内容是主键是如何定义的,以及newRatingratedFilm 的来源。如果你能把它包括在内,那会很有帮助

标签: c# entity-framework-6


【解决方案1】:

如果您确定传递的Film 是现有实体,则应使用DbSet&lt;TEntity&gt;.Attach 方法让EF 不会尝试将其插入数据库:

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

【讨论】:

  • 不太明白这有多干净或复杂,但它确实解决了我的问题。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2011-02-16
  • 2019-02-22
  • 2014-03-19
相关资源
最近更新 更多