EF CF 4.2 и SQL вместо триггера вставки - PullRequest
0 голосов
/ 28 января 2012

У меня есть класс CF:

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;}
}

В базе данных у меня есть триггер:

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;

Теперь, если я попытаюсь вставить запись:

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 Profiler:

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()

Проблема в том, что селектор ничего не возвращает.

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

@ Патрик

Попробуйте это

SELECT SCOPE_IDENTITY() as [EXAMPLE]

Где [ПРИМЕР] - имя столбца идентификации

У меня была такая же проблема, и это работало для меня.

1 голос
/ 08 мая 2012
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; 
1 голос
/ 28 января 2012

У этого объекта нет первичного ключа. EF не понравится.

Чтобы исправить текущую ошибку, попробуйте добавить это в конце вашего триггера:

SELECT @@ROWCOUNT

Если вы измените свой код для поддержки автоматически сгенерированного PK, вы будете использовать вместо этого:

SELECT SCOPE_IDENTITY()

Я не уверен, будет ли это работать вместо триггера, но это было необходимо при отображении хранимых процедур в операции модификации в EDMX.

В настоящее время возможно, что эта операция будет выполняться EF напрямую, но она не будет учитывать записи, созданные или измененные триггером, поскольку триггер выполняется в другой области действия - это может быть большой проблемой.

...