我第一次添加迁移时,我的播种工作正常。但是,如果我再次运行它,我会得到异常
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();
答案 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();