EF 如何为默认值为 0 的实体类生成插入 SQL



我是实体框架的新手,只是一个关于 EF 如何为默认为 0 的实体类生成插入 SQL 的问题。

这是数据模型类:

public class Product
{
    public long ProductID { get; set; }
    public string Name { get; set; }
}

并且 SQL 服务器中的基础表产品在产品 ID 上具有标识列。

因此,假设一个控制器使用模型绑定来创建 Product 对象 p1,然后我们执行以下操作:

context.Products.Add(p1)   //p1.ProductID = 0 for default
context.SaveChanges();

我的问题是:

  1. EF 是否需要向数据库发送查询以获取表中的最新主键Products然后加 1 才能p1.ProductID?这不是非常低效吗,因为您需要在数据库中查询最新的现有主键,然后发送另一个插入 SQL 来插入记录?

  2. Dbset<Product>.add()方法的真正含义是什么?我的意思是,如果对象的 id 为 0,我们知道它在数据库中不存在(如果 id> 0,那么我们知道我们正在修改现有记录(,我们不能只是将新创建的 p1 添加到数据库中,为什么我们仍然需要跟踪它?

1.( 不,您不需要获取最新对象的主键来确定下一个 Id。

2.( Primary Key starts from 1 not 0,在EF中,如果您使用默认身份提供程序,如下所述,EF可以管理主键自动,因此无需ANY数字设置为该变量。然后,context.Products.Add(p1)向本地表(在 RAM 中(添加值,添加后context.SaveChanges();将触发将本地值发送到 SQL 数据库。After SaveChanges you will see correct Id of value

有一个为表生成自动 ID 的功能。

  • 首先,您应该选择哪个属性是具有[Key]属性的主键。
  • 其次,您应该确定主键的类型是整数还是字符串(string has no auto Id Generator(
  • 然后,如果它是整数并且您需要自动 Id 生成器,则应使用 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 自动生成器。
  • 之后,您不必担心 EF 可以管理它ProductID的价值。
public class Product
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ProductID { get; set; }
    public string Name { get; set; }
}

not:如果你想要字符串主键(或手动添加 Id(,你应该使用 [DatabaseGenerated(DatabaseGeneratedOption.None)]

有关 EF 的更多示例(从导航器中选择 EF 版本(

最新更新