我正在使用asp.net mvc5 Web应用程序+我正在使用EF6.0。有时我无法理解EF如何在内部处理事物。例如,我有两个名为的实体;技术与发展架。其中Technology.TechnologyID
是系统生成的ID,而Rack.RackID
是用户定义的密钥,并且= Technology.TechnologyID.
。所以我有以下方法添加新技术,然后到添加新机架并将Rack.RackID
指定为等于系统生成的Technology.TechnologyID
。
Technology technology = new Technology
{
IsCompleted = false,
IsDeleted = true,
TypeID = technologyypeID,
Tag = "CAB" + max.ToString(),
PartialTag = max,
StartDate = DateTime.Now,
IT360ID = dbresource.RESOURCEID,//,,
IsManaged = rj.Technology == null ? true : rj.Technology.IsManaged
};
rj.Rack.RackID = technology.TechnologyID;
SAVE():
现在开头我虽然我上面不会起作用,因为当我尝试: -
rj.Rack.RackID = technology.TechnologyID;
此时TechnologyID将不可用,并且使用VS i发现在运行时,TechnologyID将等于零: -
所以我不确定EF如何处理这个?并强制Rack.RackID
等于Technology.TechnologyID
,但在运行时,技术ID将为零。这是从sql profiler生成的sql语句: -
exec sp_executesql N'insert [dbo].[Racks]([RackID], [DataCenterID], [ZoneID], [IT360SiteID])
values (@0, @1, @2, @3)
select [timestamp]
from [dbo].[Racks]
where @@ROWCOUNT > 0 and [RackID] = @0',N'@0 int,@1 int,@2 int,@3 bigint',@0=128,@1=3,@2=2,@3=4
不确定128
在运行时是如何分配altohugh值为零?
答案 0 :(得分:1)
您已创建新的Technology
对象,其TechnologyID
已生成数据库。插入时,EF使用select跟随插入以检索生成的值。像这样:
DECLARE @TechnologyID int
SELECT @TechnologyID = [TechnologyID]
FROM [dbo].[Technology]
WHERE @@ROWCOUNT > 0 AND [TechnologyID] = scope_identity()
然后,实体框架使用结果来修复Technology
实体,这样当您插入Rack
对象时,其RackID
(不是数据库生成的)是正确设置为新TechnologyID
(如您在代码中指定的那样)。在@0
表上发出select以检索时间戳时使用的Racks
参数也设置为新值(在您的示例中为128)。
答案 1 :(得分:0)
当您进行作业rj.Rack.RackID = technology.TechnologyID;
时,您的新technology
对象尚未提交到数据库,因此未获得指定的TechnologyID
属性。在不更改映射/架构的情况下,解决问题的最简单方法是保存一次以提交technology
并为其分配TechnologyID
,将其指定为RackID
,然后再次保存
更长,更合适的解决方案是让RackID
成为实际的标识属性,而是使用从Rack
到Technology
的外键关系以及相应的EF映射