我正在使用asp.net core 2和实体框架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中配置了fluent 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; }
和[key]public int id{get;集合;}
和
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
但运气不好。
完整的代码在这个githubrepository中。
控制器在这里。
2条答案
按热度按时间kyxcudwk1#
使用注解“databasegeneratedoption.identity”自动递增。
迁移文件应生成如下:
7eumitmz2#
您将数据注解和fluent api配置混合在一起,这不是一个好的做法。无论如何,实体框架通常将持久性模型中的int-id视为键,因此您不必手动指定它。我建议您只选择一种方法(根据我的经验,fluent 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); }); ...