【发布时间】:2019-12-01 00:55:21
【问题描述】:
我是实体框架的新手,只是一个关于 EF 如何为默认为 0 的实体类生成插入 SQL 的问题。
这是数据模型类:
public class Product
{
public long ProductID { get; set; }
public string Name { get; set; }
}
Sql server 中的基础表 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 添加到数据库中,为什么我们仍然需要追踪吗?
【问题讨论】:
-
您可以使用 sql-profiler 来监控 EF 生成的 sql-queries
-
要么您将主键定义为数据库中的
IDENTITY列(首选选项) - 然后您的 SQL Server 将负责分发一个新的、唯一的键值 - 否则 您 必须提供一个值并确保它是唯一的。 EF 肯定会不采用SELECT MAX(col)+1方法...... -
@marc_s 是的 Products 表在 sql server 的 ProductID 上有 IDENTITY 列。但是 EF 怎么会知道这个事实呢?也许表中还有其他标识列,这就是为什么我认为 EF 必须做某事,例如向 Sql 服务器发送查询以“知道”哪些列是标识列?
-
通过将
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释添加到您的键列......就这么简单......
标签: c# sql-server asp.net-mvc asp.net-core entity-framework-core