【问题标题】:Using Entity Framework code-first database issue使用实体框架代码优先数据库问题
【发布时间】:2015-12-08 01:50:47
【问题描述】:

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

违反主键约束“PK_dbo.Movies”。无法在对象“dbo.Movies”中插入重复键。重复键值为(The Room)

我不明白为什么。我不是在添加名为 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();
}

【问题讨论】:

    标签: c# database entity-framework visual-studio ef-code-first


    【解决方案1】:

    我建议您修改 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 也尝试添加 Movie,你得到了这个异常。

    【讨论】:

    • 谢谢!这对我帮助很大!
    • @RičardasMikelionis 我真的很高兴你解决了你的问题!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多