无法在对象中插入重复的键行

时间:2017-07-13 14:50:33

标签: c# sql-server asp.net-mvc entity-framework linq

我第一次添加迁移时,我的播种工作正常。但是,如果我再次运行它,我会得到异常

  

System.Data.SqlClient.SqlException:无法插入重复的键行   具有唯一索引'IX_AttributeName'的对象'dbo.Attributes'。该   重复键值为(State)。

根据我的理解,如果实体已经存在,AddOrUpdate不应该添加。我误解了吗?

属性实体

 public class Attribute
    {
        public Attribute()
        {
            IsList = false;
        }

        public int AttributeId { get; set; }

        [Required]
        [StringLength(255)]
        [Index("IX_AttributeName",1,IsUnique = true)]
        public string AttributeName { get; set; }
        public bool IsPHI { get; set; }
        public bool IsList { get; set; }
        public virtual ICollection<AttributeTerm> AttributeListTerms { get; set; }

    }

种子类的部分(在Gusman的建议之后更新)

 public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(GBARDbContext context)
        {

            var attributes = new[]
            {
            new Attribute {AttributeId = 2, AttributeName = "First Name"},
            new Attribute {AttributeId = 3, AttributeName = "Last Name"},
            new Attribute {AttributeId = 4, AttributeName = "Middle Name"},
            new Attribute {AttributeId = 5, AttributeName = "Street"},
            new Attribute {AttributeId = 1, AttributeName = "State", IsList = true},
            };

           context.Attributes.AddOrUpdate(a => a.AttributeId, attributes);
           context.SaveChanges();

2 个答案:

答案 0 :(得分:1)

我通过听Gusman和Alex S建议使用主键来播种来解决这个问题。我必须删除所有数据并首先重置Attribute表及其依赖AttributeTerm

的身份计数器
DBCC CHECKIDENT ('Attributes', RESEED, 0)
DBCC CHECKIDENT ('AttributeTerms', RESEED, 0)

答案 1 :(得分:0)

您有两列独一无二的权利吗? AttributeId和AttributeName,所以在AddOrUpdate中你应该设置它。这是解决方案:

context.Attributes.AddOrUpdate(a => new { a.AttributeId , a.AttributeName} , attributes);
context.SaveChanges();