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

本文关键字:默认值 函数 插入 框架 迁移 实体 | 更新日期: 2023-09-27 17:58:35

我首先使用实体框架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时,我得到了一个错误

重复键值为(空)

(显然…)

所以我的问题是:有没有办法(从代码中)调用一个函数来生成这样的密钥?

调用此函数生成:

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

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

您应该在Migration部分填充空的NewUniqueValue单元格:

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");
}

重复错误可能是由于数据库中的旧记录不能接受空值,因为NewUniqueValue列被索引。

用于在类调用中生成密钥generate方法:

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