EF如何获取系统生成的新添加对象的ID

时间:2015-07-31 11:07:32

标签: c# asp.net sql-server entity-framework entity-framework-6

我正在使用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将等于零: -

enter image description here

所以我不确定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值为零?

2 个答案:

答案 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成为实际的标识属性,而是使用从RackTechnology的外键关系以及相应的EF映射