使用 EfCore 1.1 ,我正在尝试使用ValueGeneratedOnAdd生成自动生成的列。问题是我总是将值变为“0”。我是否必须手动对数据库表执行任何操作?
这是我的模特
public class Contact
{
public int Id { get; set; }
// This needs to be auto generated
public Int32 ContactIndex { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
public DateTime LastAccessed { get; set; }
}
这就是我的OnModelCreating的样子
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>()
.Property(c => c.ContactIndex)
.ValueGeneratedOnAdd();
// I tried following as well but it did't work
// .HasDefaultValueSql("IDENTITY(int, 1,1)");
;
}
答案 0 :(得分:0)
好吧我想到了怎么做,但我真的想在不使用任何注释的情况下这样做,而且我仍然无法弄清楚如何在没有模型注释的情况下做到这一点。所以这是我的解决方案。
您需要在模型中注释您的字段,如下所示
public class Contact
{
public int Id { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int32 ContactIndex { get; set; }
public string FullName { get; set; }
public string Email { get; set; }
public DateTime LastAccessed { get; set; }
}
并在上下文类中添加OnModelCreating。这将告诉实体框架在添加或更新记录时忽略该列。确保调用方法.ValueGeneratedAddOrUpdate()。如果仅使用.ValueGeneratedAdd(),则在进行更新时会出现错误。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>()
.Property(c => c.ContactIndex)
.ValueGeneratedOnAddOrUpdate();
;
}
生成并运行迁移,迁移应包括&#34; SqlServerValueGenerationStrategy.IdentityColumn&#34;
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "ContactIndex",
table: "Contact",
nullable: false,
defaultValue: 0)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
}