0

私はCFのクラスを持っている:私はレコードを挿入しようとすると今EF CF 4.2およびSQL

CREATE TRIGGER IOI_LoweredName 
    ON Abc 
    INSTEAD OF INSERT 
AS; 
BEGIN; 
    SET NOCOUNT ON; 

    INSERT INTO Abc(Name, LoweredName) SELECT Name, LOWER(Name) FROM inserted 
END; 

私はトリガーを持っているデータベースで

public class A 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id {get;set;} 
    [Required] 
    public string Name {get;set;} 
    public string LoweredName {get;set;} 
    [Timestamp] 
    public byte[] RowVersion {get;set;} 
} 

dc.Names.Add(new A { Name = "Test" }); 
dc.SaveChanges(); 

私は次のエラーを取得する:

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. 

これを回避する方法はありますか? すべてのクラスは、RowVersion(Timestamp)列を持つ基本クラスから継承します。タイムスタンプフィールドで並行処理を使用する場合、EFでこのような単純なトリガーを使用することはできませんか?

主キー(上記の例に追加して)ある更新します。

アップデート2

これは、SQLプロファイラからです:

declare @0 nvarchar(100) 
set @0=N'Test' 
insert [dbo].[abc]([Name], [LoweredCompanyName]) values (@0, null) 
select [Id], [RowVersion] from [dbo].[Abc] where @@ROWCOUNT > 0 and [Id] = scope_identity() 

問題は、選択は何も返さないということです。

+0

コード内でSaveChanges以降を呼び出すと、実際にエラーが発生しますか? –

+0

SaveChanges()を実行しようとします。 – Patrick

+0

あなたのトリガは実際にRowVersionを挿入しませんか、それとも単なる単純化ですか? –

答えて

1

そのエンティティには主キーがありません。 EFはそれを好まないでしょう。あなたのトリガの最後にこれを追加しようとする現在のエラーを修正する

SELECT SCOPE_IDENTITY() 
を:

SELECT @@ROWCOUNT 

Autoをサポートするようにコードを変更した場合は、PKは、あなたの代わりにこれを使用します生成しました

これは実際にトリガーの代わりに機能するかどうかはわかりませんが、ストアドプロシージャをEDMXの変更操作にマッピングするときには必要でした。

現在のところ、この操作はEFによって直接実行される可能性がありますが、トリガーが異なるスコープで実行するため、トリガーによって作成または変更されたレコードはカウントされません。

+0

私はクラスの単純さのためにその1つを残しました。それには主キーがあります。上記の質問を更新しました。 – Patrick

+0

トリガーからスコープIDを選択しようとするとどうなりますか? –

+0

それから、私はこのメッセージを "メタデータコレクションに存在しません"というメッセージを受け取ります。\ r \ nパラメータ名:ID " – Patrick

1

パトリック

@ [例]私は同じ問題を抱えていたID列

の名前です。この

SELECT SCOPE_IDENTITY() as [EXAMPLE] 

を試してみて、これは私のために働きました。

1
CREATE TRIGGER IOI_LoweredName 
    ON Abc 
    INSTEAD OF INSERT 
AS; 
BEGIN; 
    SET NOCOUNT ON; 

    INSERT INTO Abc(Name, LoweredName) 
    OUTPUT INSERTED.Id,INSERTED.RowVersion, 
    SELECT Name, LOWER(Name) 
    FROM inserted 
END; 
関連する問題