code first insert主键问题

ss5611 2016-09-27 03:57:34
其一:
model 如下:
[Table("goods")]
public class goods
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Column("id")]
public int id { get; set; }

[Required]
[MaxLength(50)]
[Column("name", TypeName="nvarchar")]
[DefaultValue("")]
public string name { get; set; }

[Required]
[DefaultValue(0)]
[Column("num")]
public uint num { get; set; }

[Required]
[Column("price")]
[DefaultValue(0)]
public decimal price { get; set; }

[Required]
[Column("create_date")]
public DateTime create_date { get; set; }

[Required]
[DefaultValue(0)]
[Column("status")]
public int status { get; set; }
}
C# 代码如下:
Model.goods info = new Model.goods()
{
name = goods_name,
price = _price,
status = 1,
create_date = DateTime.Now
};
db.goods.Add(info);
db.SaveChanges();


code first生成的sql如下:
exec sp_executesql N'insert [dbo].[goods]([name], [price], [create_date], [status])
values (@0, @1, @2, @3)
select [id]
from [dbo].[goods]
where @@ROWCOUNT > 0 and [id] = scope_identity()',N'@0 nvarchar(50),@1 decimal(18,2),@2 datetime2(7),@3 int',@0=N'苹果389',@1=389.00,@2='2016-09-27 15:43:17.2030654',@3=1



其二:
model:
[Table("goods")]
public class goods
{
[Key]
//[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
//[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Column("id")]
public int id { get; set; }

[Required]
[MaxLength(50)]
[Column("name", TypeName="nvarchar")]
[DefaultValue("")]
public string name { get; set; }

[Required]
[DefaultValue(0)]
[Column("num")]
public uint num { get; set; }

[Required]
[Column("price")]
[DefaultValue(0)]
public decimal price { get; set; }

[Required]
[Column("create_date")]
public DateTime create_date { get; set; }

[Required]
[DefaultValue(0)]
[Column("status")]
public int status { get; set; }
}

C#代码如上

code first生成的sql如下:
exec sp_executesql N'insert [dbo].[goods]([name], [price], [create_date], [status])
values (@0, @1, @2, @3)
select [id]
from [dbo].[goods]
where @@ROWCOUNT > 0 and [id] = scope_identity()',N'@0 nvarchar(50),@1 decimal(18,2),@2 datetime2(7),@3 int',@0=N'橘子951',@1=951.00,@2='2016-09-27 15:47:40.6601343',@3=1

如何能让sql片段:
select [id]
from [dbo].[goods]
where @@ROWCOUNT > 0 and [id] = scope_identity()
去掉,而是让数据库来实现主键id的自增??



原因:
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["shop"].ToString()))
{
conn.Open();
string sql = string.Format(@"INSERT INTO goods (name, price, status, create_date) VALUES (@name, @price, @status, @create_date)");

using (var cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@name", goods_name);
cmd.Parameters.AddWithValue("@price", _price);
cmd.Parameters.AddWithValue("@status", 1);
cmd.Parameters.AddWithValue("@create_date", DateTime.Now);
cmd.ExecuteNonQuery();
}
}

与code first的代码执行时间对比 59132:95360 (Stopwatch, sw.ElapsedMilliseconds的值)






...全文
298 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ss5611 2016-10-01
  • 打赏
  • 举报
回复
引用 4 楼 daixf_csdn的回复:
[quote=引用 3 楼 ss5611 的回复:] [quote=引用 2 楼 AndroidJavaApp的回复:]又是跟踪sql,又是性能对比,看上去很专业的样子,难道连select scope_identity()这句的意图这么基本的东西都不明白?数据库自增列在insert之后需要查询自增列id的值,作为返回值赋给model.id,否则model是不完整的,没有id的,因为id是在数据库端生成的,orm都有的,不用orm就好了
那如何减少ef插入时间呢[/quote] ef插入不太可能有性能问题,你举例中差别一半的时间,是因为这个测试条件是不平等的。因为ef它多了一个返回主键的功能。 你用ado.net测试,并没有返回这个主键。但你实际的应用中,能不返回主键吗?虽然有时候不用,但也会有需要返回主键的时候。[/quote] 好的,我试一试,谢谢。。。
圣殿骑士18 2016-10-01
  • 打赏
  • 举报
回复
引用 3 楼 ss5611 的回复:
[quote=引用 2 楼 AndroidJavaApp的回复:]又是跟踪sql,又是性能对比,看上去很专业的样子,难道连select scope_identity()这句的意图这么基本的东西都不明白?数据库自增列在insert之后需要查询自增列id的值,作为返回值赋给model.id,否则model是不完整的,没有id的,因为id是在数据库端生成的,orm都有的,不用orm就好了
那如何减少ef插入时间呢[/quote] ef插入不太可能有性能问题,你举例中差别一半的时间,是因为这个测试条件是不平等的。因为ef它多了一个返回主键的功能。 你用ado.net测试,并没有返回这个主键。但你实际的应用中,能不返回主键吗?虽然有时候不用,但也会有需要返回主键的时候。
ss5611 2016-09-30
  • 打赏
  • 举报
回复
引用 2 楼 AndroidJavaApp的回复:
又是跟踪sql,又是性能对比,看上去很专业的样子,难道连select scope_identity()这句的意图这么基本的东西都不明白?数据库自增列在insert之后需要查询自增列id的值,作为返回值赋给model.id,否则model是不完整的,没有id的,因为id是在数据库端生成的,orm都有的,不用orm就好了
那如何减少ef插入时间呢
j34jyj94ksigj4j 2016-09-28
  • 打赏
  • 举报
回复
又是跟踪sql,又是性能对比,看上去很专业的样子,难道连select scope_identity()这句的意图这么基本的东西都不明白?数据库自增列在insert之后需要查询自增列id的值,作为返回值赋给model.id,否则model是不完整的,没有id的,因为id是在数据库端生成的,orm都有的,不用orm就好了
ss5611 2016-09-27
  • 打赏
  • 举报
回复
Model.goods info = new Model.goods() { name = goods_name, price = _price, status = 1, create_date = DateTime.Now }; db.goods.Add(info); db.SaveChanges(); 生成的sql:exec sp_executesql N'insert [dbo].[goods]([name], [price], [create_date], [status]) values (@0, @1, @2, @3) select [id] from [dbo].[goods] where @@ROWCOUNT > 0 and [id] = scope_identity()',N'@0 nvarchar(50),@1 decimal(18,2),@2 datetime2(7),@3 int',@0=N'苹果389',@1=389.00,@2='2016-09-27 15:43:17.2030654',@3=1” 如何将生成的sql中的select 删除了,让数据库实现自增主键

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧