【问题标题】:MVC EF5 Table column updated by trigger but value not returningMVC EF5 表列由触发器更新但值未返回
【发布时间】:2013-03-16 15:26:03
【问题描述】:

我在 SQL Server 表中定义了一个列,并使用插入后触发器设置了它的值。该值是根据最近插入的身份计算的。但是,保存数据库更改后,我无法在 Controller 中获取此值。

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

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

【问题讨论】:

  • 你能分享你的触发代码吗
  • 您是否将属性定义为在映射中生成的数据库(或带有数据注释)?
  • @RAS - 我在上面添加了我的触发代码。
  • @Ladislav Mrnka - Id 列在我的模型中定义并使用数据注释 [Key] 和 [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

标签: c# entity-framework-5


【解决方案1】:

Column3 属性必须用DatabaseGeneratedOption.Identity 定义,如果您想取回触发器在插入期间创建的数据。该声明告诉 EF 该值是在插入期间在数据库中创建的,并且它必须查询该值。

【讨论】:

  • 我不希望 Column3 作为身份。它也不能设置为已计算,因为我在创建新记录之前设置了一个值,并且插入后触发器会进一步更新它。我希望这个更新后的值回到控制器中。
  • EF 不支持在应用程序和数据库中设置的值组合。它仅支持完全在应用程序中或完全在数据库中处理的值。使用当前设置,您将需要使用另一个上下文再次查询对象(或先将其从原始上下文中分离)。 EF 不会为您将新值提取到现有对象中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多