2013-03-16 52 views
0

我已经在SQL Server表中定义了一列,并使用After Insert Trigger设置了它的值。该值基于最近插入的身份进行计算。但是,保存数据库更改后,我无法在控制器中获取此值。MVC EF5 Table列按触发器更新但未返回值

这里是我的(伪)代码控制器:

var model = new model(); 

model.column1 = abc; 
model.column2 = xyz; 
model.column3 = "CC"; 

// db object below is a model inheriting DbContext 

db.table.Add(model); 
db.SaveChanges(); 

// Do some operations not related to this table 

// Try retrieving value of column3 
// which should have been updated by the after insert trigger 

var column3Value = db.table.find(model.id).column3; 

做哪些方面的EF5我错过这里?

下面是我的触发代码:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER [dbo].[SetColumn3] 
ON [dbo].[Table] 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON 
    UPDATE Table 
    SET Column3 = RTRIM(inserted.Column3) + CAST(inserted.Id + 100 AS nvarchar(10)) 
    FROM inserted 
    WHERE Table.Id = inserted.Id; 
END 
+0

您能否分享您的触发代码请 – RAS 2013-03-16 21:15:27

+0

您是否已将该属性定义为在映射(或带有数据注释)中生成的数据库? – 2013-03-17 11:33:19

+0

@RAS - 我在上面添加了我的触发器代码。 – Santosh 2013-03-17 11:49:31

回答

1

Column3属性必须以DatabaseGeneratedOption.Identity如果你想找回插入过程中你的触发创建的数据来定义。该声明告诉EF,该值在插入时在数据库中创建,并且必须查询该值。

+0

我不希望Column3作为标识。它不能被设置为Computed,因为我在创建新记录之前设置了一个值,后插入触发器进一步更新它。我想在控制器中重新获得这个更新的值。 – Santosh 2013-03-18 06:59:48

+0

EF不支持在应用程序和数据库中设置的值组合。它仅支持在应用程序中完全处理的值或完全在数据库中处理的值。使用当前设置,您将需要使用另一个上下文来再次查询对象(或先从原始上下文中分离它)。 EF不会将您的新值拉入现有对象。 – 2013-03-18 08:13:45