2

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

現在、EntityFramework4を使用するMVC3Webアプリケーションを開発しています。次のコードを実行すると、デフォルトは適用されず、トリガーは起動されません。

// 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のためにトリガーが起動されないため、デフォルトは適用されないと推測しています。これを回避する方法はありますか?

4

3 に答える 3

1

EFを使用する場合、基本的には、アプリケーションがデータベースではなくマスターであることを受け入れる必要があります。

データベースのデフォルトの制約ではなく、コンストラクターでデフォルト値を設定する必要がありますRoom(確かに、作成/更新された日付では、タイムゾーンの理由などでデータベースでこれを行うことができます...)

EntityFramework-データアノテーションを使用したプロパティのデフォルト値

于 2013-02-25T11:25:55.913 に答える
1

@JustAnother ...が言うように、常に値が提供されるため、制約はほとんど役に立ちませんが、トリガーは引き続き正常に機能するはずです。

TrackingIDSQLトレースでは、の値がnullであることがわかります。トリガーでテストしているのTrackingID=0は、の場合はfalseTrackingID = nullです。

null同様にテストするためにトリガーを更新してみてください。

于 2013-02-25T11:26:59.293 に答える
1

Entity Frameworkは、デフォルトの制約を気にしません。EFモデルで列がIdentityまたはComputedとしてマークされていない限り、常に値が送信されます。列を「計算済み」に変更すると、エンティティオブジェクトで列を更新できなくなり、常にデータベース値(したがってデフォルトの制約値)が取得されます。

于 2013-02-25T11:21:18.173 に答える