EntityState в обновлении?

Каков правильный подход при обновлении записи в CFE?

Мы используем контроллеры webapi на основе эта ссылка, клиентская часть разработана благодаря AngularJS. У меня возникают проблемы с обновлением уже существующей записи, и мой код завершается с ошибкой CodeFluentDuplicateException.

Я прочитал здесь, что EntityState не следует изменять вручную. Когда я хочу обновить версию сервера с изменениями клиента, я должен учитывать:

  • Взяв версию сервера, а затем применив изменения, сделанные клиентом?
  • Запросить у клиентской версии Save() ?
  • Любой другой подход?

Спасибо за Ваш ответ,


person Olivier ROMAND    schedule 10.03.2016    source источник


Ответы (1)


CodeFluentDuplicateException означает, что вы вставляете запись, которая уже существует в базе данных. Это происходит, когда хранимая процедура выполняет оператор INSERT вместо UPDATE. Объекты CodeFluent не используют EntityState, чтобы выбрать, должен ли объект создаваться или обновляться в базе данных. В зависимости от модели используется свойство RowVersion (вставьте, если null; в противном случае обновите). Если выбора нет, хранимая процедура выполняет ОБНОВЛЕНИЕ и, когда строки не обновляются, вставляет строку. Например:

CREATE PROCEDURE [dbo].[Role_Save]
(
 @Role_Id [uniqueidentifier],
 @Role_Name [nvarchar] (256),
)
AS
SET NOCOUNT ON
IF(@_rowVersion IS NOT NULL)
BEGIN
    UPDATE [Role] SET
     [Role].[Role_Name] = @Role_Name
        WHERE (([Role].[Role_Id] = @Role_Id) AND ([Role].[_rowVersion] = @_rowVersion))
END
ELSE
BEGIN
    INSERT INTO [Role] (
        [Role].[Role_Id],
        [Role].[Role_Name])
    VALUES (
        @Role_Id,
        @Role_Name)
END

Поэтому в вашем случае я бы проверил код сгенерированной хранимой процедуры, чтобы понять, почему она пытается вставить запись вместо ее обновления.

На самом деле вы можете изменить EntityState вручную, если вам нужно, но есть только несколько причин для этого.

person meziantou    schedule 10.03.2016
comment
Спасибо за это ценное возвращение, это, безусловно, поможет мне в долгосрочной перспективе. - person Olivier ROMAND; 10.03.2016