2015-12-08 107 views
0

我使用代码优先方法创建了一个数据库。现在当我尝试添加一个显示到我的Cinema数据库时,我得到一个DbupdateException。它说使用实体框架代码优先数据库问题

违反PRIMARY KEY约束'PK_dbo.Movies'。无法在对象'dbo.Movies'中插入重复键。重复键值是(房间)

我不明白为什么。我没有添加名为The Room的新电影,我正在使用新密钥添加一个显示。

namespace Cinema3Project.Tables 
{ 
    class Showing 
    { 
     [Key] 
     public int Number { get; set; } 
     public DateTime Date { get; set; } 
     public TimeSpan Time { get; set; } 
     public virtual Movie Movie { get; set; } 
     public virtual Screen Screen { get; set; } 
    } 
} 

class Movie 
{ 
    [Key] 
    public string Name { get; set; } 
    public string Director { get; set; } 
    public string Genre { get; set; } 
    public string Language { get; set; } 
    public int LengthMin { get; set; } 
} 

插入方法是这样的:

using (var db = new CinemaContext()) 
{ 
    db.Showings.Add(showing); 
    db.SaveChanges(); 
} 

回答

1

我建议你修改你的显示模式,有是电影FK财产。所以你会设置这个属性,而不是设置Movie属性。

public class Showing 
{ 
    public string MovieName { get; set; } 
    [ForeignKye("MovieName")] 
    public virtual Movie Movie { get; set; } 
} 

然后设置的movieName

//showing.Movie do not set this property 
showing.MovieName = movie.Name; 
using (var db = new CinemaContext()) 
{ 
    db.Showings.Add(showing); 
    db.SaveChanges(); 
} 

由于您使用的上下文的新实例,当你说EF英孚添加您的表现,它会尝试添加整个对象图表,在这一刻,EF认为你的电影从展示对象是一个新的实体,所以EF也尝试添加电影,你会得到这个异常。

+0

谢谢!这帮了我很多! –

+0

@RičardasMikelionis我很高兴你解决了你的问题! –