LINQ到实体-触发器和表默认值

本文关键字:默认值 触发器 实体 LINQ | 更新日期: 2023-09-27 18:01:12

我有一个名为Room的数据库表。

此表在某些列上有一些默认值:

ALTER TABLE [dbo].[Room] ADD  CONSTRAINT [DF_Room_Created]  DEFAULT (getdate()) FOR [Created]
GO
ALTER TABLE [dbo].[Room] ADD  CONSTRAINT [DF_Room_Updated]  DEFAULT (getdate()) FOR [Updated]
GO
ALTER TABLE [dbo].[Room] ADD  CONSTRAINT [DF_Room_RecordStatus]  DEFAULT (0) FOR [RecordStatus]

该表还具有以下触发器:

ALTER TRIGGER [dbo].[RoomInsert] ON [dbo].[Room]
FOR INSERT 
AS
DECLARE @PKey int, @TrackingId int
SELECT @PKey = PKey, @TrackingId = TrackingId FROM INSERTED
IF @TrackingId = 0
UPDATE Room
SET TrackingId = @PKey
WHERE PKey = @PKey

我们目前正在开发一个使用实体框架4的MVC 3 Web应用程序。当我运行以下代码时,没有应用任何默认值,也没有触发:

// Create the new room record
                Room newRoom = new Room();
                newRoom.SiteKey = parentFloor.SiteKey;
                newRoom.SiteSurveyKey = parentFloor.SiteSurveyKey;
                newRoom.BuildingKey = parentFloor.BuildingKey;
                newRoom.FloorKey = parentFloor.PKey;
                newRoom.Name = eventModel.RoomName;
                newRoom.Description = eventModel.RoomName;
                newRoom.CreatedBy = eventModel.UserKey;
                _entities.Rooms.AddObject(newRoom);
                _entities.SaveChanges();

我在数据库上运行了一个配置文件,插入会产生以下内容:

exec sp_executesql N'insert [dbo].[Room]([TrackingID], [OriginalPKey], [BuildingKey], [SiteSurveyKey], [SiteKey], [Name], [Description], [RiskColour], [CreatedBy], [Created], [Updated], [RecordStatus], [FloorKey], [DisplayOrder])
values (null, null, @0, @1, @2, @3, @4, null, @5, null, null, null, @6, null)
select [PKey]
from [dbo].[Room]
where @@ROWCOUNT > 0 and [PKey] = scope_identity()',N'@0 int,@1 int,@2 int,@3 varchar(255),@4 varchar(255),@5 int,@6 int',@0=29970,@1=20177,@2=39373,@3='Another Room ',@4='Another Room ',@5=139,@6=25454

我猜测没有应用默认值,因为专门传递了NULL,并且由于sp_executesql没有触发触发器。有什么办法绕过这个吗?

LINQ到实体-触发器和表默认值

作为@JustAnother。。。说,限制将没有什么用处,因为你总是会有一个值提供,但你的触发器应该仍然可以工作。

在SQL跟踪中,您将看到TrackingID的值为null。在触发器中,您正在测试TrackingID=0,当TrackingID = null时为false。

尝试更新触发器以测试null

Entity Framework不关心您的默认约束。只要您的列在EF模型中未标记为Identity或Computed,它将始终提交一个值。当您将列更改为"Computed"时,您不能再使用实体对象更新列,它将始终采用数据库值(因此也是默认的约束值(。

当您使用EF时,您基本上只需要接受应用程序是主机,而不是数据库。

您应该在Room构造函数中设置默认值,而不是通过数据库默认约束(诚然,对于创建/更新日期,出于时区等原因,您可能希望在数据库中这样做。(

实体框架-使用数据注释的属性的默认值