首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF6 SqlException:违反主键约束.重复的键值是(0)

EF6 SqlException:违反主键约束.重复的键值是(0)
EN

Stack Overflow用户
提问于 2019-02-10 09:10:36
回答 2查看 1K关注 0票数 0

我知道SQL,但我对ORM非常陌生,在2017年使用EntityFramework 6.2.0玩沙箱。我认为框架应该使我能够或多或少地像使用POCO对象那样编码,而不必处理主/外键。当我调用下面的代码context.SaveChanges()时,这些更改就会保存在数据库中;对于EF6及其文档,我还不了解什么呢?

我使用外键和1:n关系创建了两个表Person和WorkingHours。

代码语言:javascript
复制
  CREATE TABLE [dbo].[Person](
    [FirstName] [nvarchar](100) NOT NULL,
    [LastName] [nvarchar](100) NOT NULL,
    [BirthDate] [date] NULL,
    [Id] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE TABLE [dbo].[WorkingHours](
  [Id] [int] NOT NULL,
  [PersonId] [int] NOT NULL,
  [Date] [date] NOT NULL,
  [Start] [time](7) NOT NULL,
  [Hours] [real] NOT NULL,
 CONSTRAINT [PK_WorkingHours] PRIMARY KEY CLUSTERED 
(
  [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

I从数据库.创建了模型

我尝试创建两个Person条目,每个条目都带有一个WorkingHours条目,并立即将其保存到数据库中。以下是代码:

代码语言:javascript
复制
     static void Main(string[] args)
    {
        using(var context = new EntityFrameworkTrialEntities2())
        {
             // Inserting entries
            var person1 = new Person() { FirstName = "Al", LastName = "Curie", BirthDate = new DateTime(1867, 11, 7) };
            var person2 = new Person() { FirstName = "Al", LastName = "Capone", BirthDate = new DateTime(1899, 1, 7) };
            context.Person.Add(person1);
            context.Person.Add(person2);

            var workingHour1 = new WorkingHour() { Date = new DateTime(1887, 8, 18), Start = new TimeSpan(6, 35, 33), Hours = 4.3F };
            var workingHour2 = new WorkingHour() { Date = new DateTime(1919, 9, 19), Start = new TimeSpan(10, 23, 56), Hours = 3.2F };
            person2.WorkingHours.Add(workingHour1); 
            person1.WorkingHours.Add(workingHour2); 

            context.WorkingHours.Add(workingHour1);
            context.WorkingHours.Add(workingHour2);
            context.SaveChanges(); // <-- place of exeception !!!!!!!!!!!!!!!!!!!!

            // (next step as EF6 trial: here the previously intentionally mixed relationships between person1/2 and workingHour2/1 shall be corrected)

但是在调用context.SaveChanges()时,我得到了这个异常:

SqlException:违反主键约束 'PK_WorkingHours‘。无法在对象'dbo.WorkingHours‘中插入重复键。重复的键值为(0)。语句已终止。**

我尝试了不同的方式,更多的context.SaveChanges()和附加()和其他命令,但我总是失败,除了上述例外。context.Configuration.ProxyCreationEnabled设置为true为默认值。

在这里,模型类:

代码语言:javascript
复制
public partial class Person
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Person()
    {
        this.WorkingHours = new HashSet<WorkingHour>();
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Nullable<System.DateTime> BirthDate { get; set; }
    public int Id { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<WorkingHour> WorkingHours { get; set; }
}


public partial class WorkingHour
{
    public int Id { get; set; }
    public int PersonId { get; set; }
    public System.DateTime Date { get; set; }
    public System.TimeSpan Start { get; set; }
    public float Hours { get; set; }

    public virtual Person Person { get; set; }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-10 09:17:29

第一个问题是主键 WorkingHour不是Identity Key,这就是为什么每个WorkingHour总是将其设置为0 (默认值int),因此被复制。

因此,使Id列的WorkingHour [Id] [int] IDENTITY(1,1) NOT NULL

第二个问题出现在以下几行:

代码语言:javascript
复制
person2.WorkingHours.Add(workingHour1); // adding with person
person1.WorkingHours.Add(workingHour2); // adding with person

context.WorkingHours.Add(workingHour1); // adding individually
context.WorkingHours.Add(workingHour2); // adding individually

在这里,您将在上下文中添加两次WorkingHour。一个带有Person实体,另一个是单独的。因此,移除第二组,只需按以下方式使用第一组:

代码语言:javascript
复制
person2.WorkingHours.Add(workingHour1); 
person1.WorkingHours.Add(workingHour2);
票数 2
EN

Stack Overflow用户

发布于 2019-02-10 09:34:55

我认为你的问题是因为[Id] in [WorkingHours]

代码语言:javascript
复制
  CREATE TABLE [dbo].[WorkingHours](
      [Id] [int] NOT NULL,
      [PersonId] [int] NOT NULL,
      [Date] [date] NOT NULL,
      [Start] [time](7) NOT NULL,
      [Hours] [real] NOT NULL,
     CONSTRAINT [PK_WorkingHours] PRIMARY KEY CLUSTERED 
    (
      [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]

按下面的方式更改,然后再试一次。

代码语言:javascript
复制
 CREATE TABLE [dbo].[WorkingHours](
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [PersonId] [int] NOT NULL,
      [Date] [date] NOT NULL,
      [Start] [time](7) NOT NULL,
      [Hours] [real] NOT NULL,
     CONSTRAINT [PK_WorkingHours] PRIMARY KEY CLUSTERED 
    (
      [Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54614941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档