我正在使用ASP.Net Core 2和Entity Framework Core与MySQL。
我想在数据库中添加一个简单的实体。
我的模型是这样的 -
public class Employee
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string City { get; set; }
[Required]
public string Department { get; set; }
[Required]
public int Salary { get; set; }
}
我在DBContext中配置了像这样的流畅API -
//Key automatic generation configuration
modelBuilder.Entity<Employee>()
.Property(b => b.Id)
.ValueGeneratedOnAdd();
然后从控制器调用添加这样的内容 -
Employee employee = new Employee
{
City = newString,
Department = newString,
Name = newString,
Salary = DateTime.UtcNow.Millisecond
};
_context.Employee.Add(employee);
_context.SaveChanges();
我所看到的是更新 ID = 1 的第一个数据,并且从不添加新数据。我希望我的ID能够自动递增,并且不想使用GUID来维护ID。我需要做些什么来使其发挥作用?
我已经尝试过了 -
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
和 [键] public int Id {get;组; }
和
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
但没有运气。
完整的代码位于this Github Repository。
控制器 here 。
答案 0 :(得分:0)
使用注释“DatabaseGeneratedOption.Identity”进行自动增量。
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
迁移文件应如下生成:
CreateTable(
"dbo.table",
c => new
{
Id = c.Int(nullable: false, identity: true),
.............
})
.PrimaryKey(t => t.Id);
答案 1 :(得分:0)
您正在混合数据注释和流畅的api配置,这不是一个好习惯。无论如何,实体框架将持久性模型中的int Id视为关键,因此您不必手动指定它。我建议你只选择一种方法(从我的经验来看,流畅的api通常更好 - 未来更具可扩展性,持久性模型看起来更干净)并试着去指定Id应该或不应该改变因为没有它你会得到你的东西想。
您的迁移应如下所示:
migrationBuilder.CreateTable(
name: "TableName",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy",
SqlServerValueGenerationStrategy.IdentityColumn)
},
constraints: table =>
{
table.PrimaryKey("PK_TableName", x => x.Id);
});
...