我正在使用Entity Framework 6.1.1代码优先。
我正在尝试向我的对象添加一个新属性(使用迁移和带有值的现有DB),这将是一个独特的
这是对象:
public class A
{
public int ID { get; set; }
public string Name { get; set; }
}
在我编辑之后:
public class A
{
public int ID { get; set; }
public string Name { get; set; }
public string NewUniqueValue { get; set; }
}
和流利的api:
modelBuilder.Entity<A>().HasKey(x => x.Id);
modelBuilder.Entity<A>().Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// after added new property
modelBuilder.Entity<A>().Property(x => x.NewUniqueValue).HasMaxLength(20).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = true }));
但是当我尝试运行Update-Database
时,我收到错误
重复键值为(null)
(显然...)
所以我的问题是:有没有办法调用函数(从代码中)来生成这样的密钥?
调用此函数进行生成:
public static string Generate()
{
Random rnd = new Random();
var chars = "abcdef0123456789";
var unique = String.Empty;
for (int i = 0; i < 20; i++)
{
unique += chars[rnd.Next(0, chars.Length)];
}
return unique;
}
答案 0 :(得分:1)
您应该在NewUniqueValue
部分填写空Migration
个单元格:
public override void Up()
{
AddColumn("dbo.TableA", "NewUniqueValue", c => c.String(maxLength: 20));
//you should add this row:
Sql("UPDATE dbo.TableA SET NewUniqueValue = NEWID()")
CreateIndex("dbo.TableA", "NewUniqueValue", unique: true);
}
public override void Down()
{
DropIndex("dbo.TableA", "NewUniqueValue");
DropColumn("dbo.TableA", "NewUniqueValue");
}
答案 1 :(得分:0)
由于数据库中的旧记录无法接受空值,可能会发生重复错误,因为NewUniqueValue列已编入索引。
用于A类调用中的生成键生成方法:
public class A
{
public A()
{
NewUniqueValue = Generate();
//or use guid
NewUniqueValue = Guid.NewGuid().ToString();
}
public int Id { get; set; }
public string Name { get; set; }
public string NewUniqueValue { get; set; }
public static string Generate()
{
Random rnd = new Random();
var chars = "abcdef0123456789";
var unique = String.Empty;
for (int i = 0; i < 20; i++)
{
unique += chars[rnd.Next(0, chars.Length)];
}
return unique;
}
}