我有两个模型Film
和Rating
在数据库中反映为具有相同名称的表,它们都具有Guid ID并且通过FilmRating
表相互关联(没有模特)。
为了生成FilmRating表,我在每个模型列表中引用了另一个,例如。 List<Film> RatedFilms
和List<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实现方法调用的方法从另一个项目调用(但被调用)。
答案 0 :(得分:1)
如果您确定传递的Film
是现有实体,那么您应该使用DbSet<TEntity>.Attach
方法让EF不要尝试将其插入数据库中:
using (var context = new IW5Context())
{
context.Films.Attach(ratedFilm);
context.Ratings.Add(newRating);
context.SaveChanges();
}