error when inserting into table having instead of trigger from entity data framework

前端 未结 4 2008
旧时难觅i
旧时难觅i 2020-11-28 12:01

I\'m using entity framework 4 , on inserting a new record using entity framework in a table that have instead of insert trigger while the table has an identity column , the

相关标签:
4条回答
  • 2020-11-28 12:26

    I also found that you need to have the StoreGeneratedPattern set to Identity to get it to work on a nvarchar column that I was using as a primary key but which was not generating an identity value. This was for situations of an after insert trigger which computed a unique value to store in the key column. In other situations (add and update), it may require being set to Computed.

    0 讨论(0)
  • 2020-11-28 12:32

    Using Entity Framework 4.1, the solution posted by Ladislav to add a Select of Scope_Identity() to the end of the trigger body solved the problem for me. I have copied the entire trigger creation here for completeness. With this trigger defenition I was able to add rows to the table using context.SaveChanges().

    ALTER TRIGGER [dbo].[CalcGeoLoc]
       ON  [dbo].[Address]
       INSTEAD OF INSERT
    AS 
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT OFF;
    
    -- Insert statements for trigger here
    INSERT INTO Address (Street, Street2, City, StateProvince, PostalCode, Latitude, Longitude, GeoLoc, Name)
    SELECT Street, Street2, City, StateProvince, PostalCode, Latitude, Longitude, geography::Point(Latitude, Longitude, 4326), Name 
    FROM Inserted;
    
    select AddressId from [dbo].Address where @@ROWCOUNT > 0 and AddressId = scope_identity();
    END
    

    Edit for handling computed values (Thanks to Chris Morgan in the comments):

    If you have any other computed values in the table you will have to include them in the SELECT as well. For example if you had a CreatedDate column that uses GETDATE() you would make the select like this:

    SELECT [AddressId], [CreatedDate] from [dbo].Addresses where @@ROWCOUNT > 0 and AddressId = scope_identity();
    
    0 讨论(0)
  • 2020-11-28 12:33

    You also need to return any properties marked as Computed

    select [Id], [YourComputedColumn]
    from [dbo].[TableXXX]
    where @@ROWCOUNT > 0 and [Id] = scope_identity()
    
    0 讨论(0)
  • 2020-11-28 12:39

    Instead of trigger is executed instead of Insert operation created by Entity framework. This can be potential problem because once you are using identity column each insert is followed by:

    select [Id]
    from [dbo].[TableXXX]
    where @@ROWCOUNT > 0 and [Id] = scope_identity()
    

    So the question is what happens with this query once insert is replaced. If it is executed and return null you get and exception. You can add it after you insert record in your trigger but it will not help if the original query is executed as well.

    You can change your trigger to be either before or after insert and modify data.

    0 讨论(0)
提交回复
热议问题