更新中的EntityState?

时间:2016-03-10 09:08:34

标签: codefluent

在CFE中更新记录时,正确的方法是什么?

我们正在使用基于this link的webapi控制器,由于AngularJS,客户端得到了开发。 我无法更新已存在的记录,并且我的代码因CodeFluentDuplicateException而失败。

我读到here,不应手动更改EntityState。当我想用客户端更改来更新服务器版本时,我应该考虑:

  • 获取服务器版本,然后应用客户端所做的更改?
  • 要求客户端版本保存()?
  • 还有其他方法吗?

感谢您的回答,

1 个答案:

答案 0 :(得分:1)

CodeFluentDuplicateException表示您正在插入数据库中已存在的记录。当存储过程执行INSERT语句而不是UPDATE时,会发生这种情况。 CodeFluent实体不使用EntityState来选择是否必须在数据库中创建或更新实体。根据您的模型,它使用RowVersion属性(如果null则插入;否则更新)。如果没有办法选择,则存储过程执行UPDATE,当没有更新行时,它会插入行。例如:

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,但只有几个理由可以这样做。