使用实体框架代码首先数据库问题

本文关键字:数据库 问题 代码 实体 框架 | 更新日期: 2023-09-27 18:26:12

我使用代码优先的方法创建了一个数据库。现在,当我尝试向我的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();
}

使用实体框架代码首先数据库问题

我建议您修改Showing模型,使其具有Movie 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也尝试添加电影,您会得到此异常。