- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
浏览 Tom Dykstra 的 Getting Started with Entity Framework 6 Code First using MVC 5教程,part 9涵盖如何设置 EF6 以使用 CUD 的存储过程。
当通过包管理器控制台添加 DepartmentSP
迁移时,会自动生成以下 CreateStoredProcedure() 调用以创建 Department_Insert 存储过程:
CreateStoredProcedure(
"dbo.Department_Insert",
p => new
{
Name = p.String(maxLength: 50),
Budget = p.Decimal(precision: 19, scale: 4, storeType: "money"),
StartDate = p.DateTime(),
InstructorID = p.Int(),
},
body:
@"INSERT [dbo].[Department]([Name], [Budget], [StartDate], [InstructorID])
VALUES (@Name, @Budget, @StartDate, @InstructorID)
DECLARE @DepartmentID int
SELECT @DepartmentID = [DepartmentID]
FROM [dbo].[Department]
WHERE @@ROWCOUNT > 0 AND [DepartmentID] = scope_identity()
SELECT t0.[DepartmentID]
FROM [dbo].[Department] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DepartmentID] = @DepartmentID"
);
为什么自动生成的存储过程中有两条SELECT
语句?
我测试了以下简化:
CreateStoredProcedure(
"dbo.Department_Insert",
p => new
{
Name = p.String(maxLength: 50),
Budget = p.Decimal(precision: 19, scale: 4, storeType: "money"),
StartDate = p.DateTime(),
InstructorID = p.Int(),
},
body:
@"INSERT [dbo].[Department]([Name], [Budget], [StartDate], [InstructorID])
VALUES (@Name, @Budget, @StartDate, @InstructorID)
SELECT t0.[DepartmentID]
FROM [dbo].[Department] AS t0
WHERE @@ROWCOUNT > 0 AND t0.[DepartmentID] = scope_identity()"
);
.. 这似乎工作正常,但我可能遗漏了一些东西。
我已阅读 What's New in Entity Framework 6 (Plus How To Upgrade!)和 Code First Insert/Update/Delete Stored Procedure Mapping spec .另外,我查看了 EF6 git 提交历史并找到了 commit 1911dc7 ,这是在迁移中启用存储过程脚手架的第一部分。
最佳答案
我想我明白了。
生成 Insert 存储过程主体的代码可在 src/EntityFramework.SqlServer/SqlGen/DmlFunctionSqlGenerator.cs
中的 DmlFunctionSqlGenerator.GenerateInsert() 方法中找到。 .
相关代码如下:
// Part 1
sql.Append(
DmlSqlGenerator.GenerateInsertSql(
firstCommandTree,
_sqlGenerator,
out _,
generateReturningSql: false,
createParameters: false));
sql.AppendLine();
var firstTable
= (EntityType)((DbScanExpression)firstCommandTree.Target.Expression).Target.ElementType;
// Part 2
sql.Append(IntroduceRequiredLocalVariables(firstTable, firstCommandTree));
// Part 3
foreach (var commandTree in commandTrees.Skip(1))
{
sql.Append(
DmlSqlGenerator.GenerateInsertSql(
commandTree,
_sqlGenerator,
out _,
generateReturningSql: false,
createParameters: false));
sql.AppendLine();
}
var returningCommandTrees
= commandTrees
.Where(ct => ct.Returning != null)
.ToList();
// Part 4
if (returningCommandTrees.Any())
{
//...
第 1 部分生成 INSERT
语句。第 2 部分生成 DECLARE
行和第一个 SELECT
语句。第 4 部分生成第二个 SELECT
语句。
在 Contoso University 示例中,Department 实体类是一个简单的模型类。似乎在这种情况下,传递给 DmlFunctionSqlGenerator.GenerateInsert() 的 commandTrees
集合仅包含一个 DbInsertCommandTree
元素。因此,实际上跳过了第 3 部分中的 foreach
循环。
在其他情况下,commandTrees
集合中可以有多个DbInsertCommandTree
元素,例如当一个实体类扩展另一个实体类和Table per Type inheritance mapping strategy 时用来。例如:
[Table("SpecialOrder")]
public class SpecialOrder
{
public int SpecialOrderId { get; set; }
public DateTime Date { get; set; }
public int Status { get; set; }
}
[Table("ExtraSpecialOrder")]
public class ExtraSpecialOrder : SpecialOrder
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ExtraSpecialOrderId { get; set; }
public string ExtraNotes { get; set; }
}
ExtraSpecialOrder 实体的脚手架插入存储过程是:
CreateStoredProcedure(
"dbo.ExtraSpecialOrder_Insert",
p => new
{
Date = p.DateTime(),
Status = p.Int(),
ExtraNotes = p.String(),
},
body:
@"INSERT [dbo].[SpecialOrder]([Date], [Status])
VALUES (@Date, @Status)
DECLARE @SpecialOrderId int
SELECT @SpecialOrderId = [SpecialOrderId]
FROM [dbo].[SpecialOrder]
WHERE @@ROWCOUNT > 0 AND [SpecialOrderId] = scope_identity()
INSERT [dbo].[ExtraSpecialOrder]([SpecialOrderId], [ExtraNotes])
VALUES (@SpecialOrderId, @ExtraNotes)
SELECT t0.[SpecialOrderId], t1.[ExtraSpecialOrderId]
FROM [dbo].[SpecialOrder] AS t0
JOIN [dbo].[ExtraSpecialOrder] AS t1 ON t1.[SpecialOrderId] = t0.[SpecialOrderId]
WHERE @@ROWCOUNT > 0 AND t0.[SpecialOrderId] = @SpecialOrderId"
);
请注意,在这种情况下需要两个 INSERT
语句。
因此,Department 实体类的脚手架 Insert 存储过程包含两个 SELECT
语句,因为这样一来,SQL 生成可扩展到多个 INSERT
语句的情况生成。虽然输出不适用于只有一个 INSERT
语句的情况,但可以手动编辑生成的存储过程主体,以便只有一个 SELECT
声明。
关于c# - CUD : What is the purpose of the two SELECT statements in a scaffolded Insert stored procedure? 的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32014909/
如您所见,我的按钮位于 Scaffold 内的 body 。但我得到了这个异常(exception): 使用不包含 Scaffold 的上下文调用 Scaffold.of()。 import 'pac
我看到有一些方法可以在 Entity Framework Core 2.0 中构建实体和数据库上下文。 使用 Scaffold-DbContext 使用 dotnet ef dbcontext 脚手架
Spring Roo:[ Controller 脚手架 --class] 和 [web mvc 脚手架 --class] 之间的区别 现在我们想要为 session 应用程序搭建一个网络层。这是使用
我对 MVC3 的各种不同的“主流”脚手架选项有点困惑。有一个名为 MVCScaffolding 的 NuGet 包.它于 2011 年 1 月首次出现,但似乎很活跃并且最近有更新,由 Scott H
我不明白为什么在 flutter 中不可能有这样的结构: //... Scaffold( //... body: myPage(dataList[index]) ) //... 其中 myPa
我喜欢脚手架,它对原型(prototype)设计非常有帮助。但是我们应该使用脚手架来开发应用程序吗? 最佳答案 “脚手架”这个名字现在在 Rails 中有点用词不当(2.0 后)。通过脚手架生成器生成
我的类(class)没有在AppBar中显示后退按钮, 已经尝试将this.automaticallyImplyLeading = true, import 'package:carros/pages
为什么点击我的iconButton我的 snackBar用 Scaffold.of() 向我抛出异常? Scaffold.of() called with a context that does no
我正在处理一个新的小原型(prototype)项目,并尝试使用脚手架功能加载数据。我完成了保存过程,它说它已经保存在 UI 上,但后来我重新访问,对象列表仍然为 0。我添加了 loggingSql:
由于返回脚手架,我的代码一直给我错误。这是我的脚手架代码: class _DashboardState extends State { @override Widget build(Bui
我想使用 Yeoman 搭建我正在进行的几个不同的项目。然而,现在,我想从一些简单的事情开始,比如拥有一个创建以下文件夹结构的生成器: /build/ /src/ /spec/ /spec/test/
The docs对于 NPM 包 grunt-scaffold 缺乏关于其 after() 属性/函数的任何信息。我有一个 grunt 文件,它为新脚本创建一个新目录,并且将样板文件从指定的模板文
我想创建一个与脚手架主体颜色相同的 AppBar,但是我无法弄清楚主体的颜色。我检查了 Scaffold 的源代码,但是他们那里也没有颜色代码。 有什么办法可以查出来吗?谢谢 最佳答案 Scaffol
我发布这个问题是因为很难找到我需要的回复,但我想它一定已经在某个地方得到了回复。如果确实在其他地方被询问和回复,请指出正确的方向 请参见下图,取自 kitkat 设备。脚手架的背景是红色的,主体是绿色
有没有办法让 Scaffold.bottomSheet 部分透明(比如显示其背后正文内容的缺口)?我注意到即使只添加 Text 也会隐式地在其下方放置一个白色背景(Material?),我认为这是不可
根据MS Docs , Scaffold-DbContext 应该接受一个可选参数 -Namespace。但是,似乎 Scaffold-DbContext 无法识别此参数。我错过了什么吗? 命令错误:
我在脚手架中有一个应用栏。 return Scaffold( appBar: styling.appBar( AppBar( leading: styling.icon
我正在尝试使用 Rails 4 搭建一个应用程序,但我在前键、表单和实体名称方面遇到了这个小问题。以下是一些细节: rails g scaffold user_type name:string rai
我正在尝试生成一个布局,我可以在 my rails webapp 之间使用它和移动版本。我一直在用nifty-generator ,但它说生成的文件与 rails3 新应用程序创建生成的文件相同。 d
我是 Ruby on Rails 的新手,我正在尝试创建一个低音吉他导师,以便自学 RoR(和低音吉他)。演练使用 Scaffold 创建 ActiveRecord 类,但它们似乎对应于独立表;没有用
我是一名优秀的程序员,十分优秀!