我是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();
我的问题是:
EF是否需要向数据库发送查询以获取Products
表中的最新主键,然后再加上1作为p1.ProductID
?效率不是很低,因为您需要查询数据库以获取最新的现有主键,然后发送另一个插入SQL来插入记录?
Dbset<Product>.add()
方法的真正含义是什么?我的意思是,如果对象的id为0,我们知道它在数据库中不存在(如果id> 0,那么我们就知道我们正在修改现有记录),我们不能只是将新创建的p1添加到数据库中,为什么我们仍然需要跟踪吗?
答案 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
)[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
来自动生成。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版本)