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

时间:2019-07-23 03:34:45

标签: c# sql-server asp.net-mvc asp.net-core entity-framework-core

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

这是数据模型类:

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

和Sql服务器中的基础表Products在ProductID上具有标识列。

因此,假设一个使用模型绑定创建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 个答案:

答案 0 :(得分:1)

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
  • 然后,如果它是Integer并且需要自动ID生成器,则应使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]来自动生成。
  • 此后,您不必担心EF可以管理ProductID的价值。
public class Product
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public long ProductID { get; set; }
    public string Name { get; set; }
}

否:如果要使用字符串主键(或手动添加ID),则应使用[DatabaseGenerated(DatabaseGeneratedOption.None)]

more examples about EF(从导航器中选择EF版本)