实体框架迁移从函数插入默认值

时间:2016-07-25 15:13:04

标签: c# entity-framework

我正在使用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;
}

2 个答案:

答案 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;
    }
}