我正在尝试更新Transaction类的对象
public int Id { get; set; }
public System.DateTime Date { get; set; }
public string Remarks { get; set; }
public double Amount { get; set; }
public Nullable<long> GroupId { get; set; }
public long UserId { get; set; }
public virtual ICollection<User> PaidForUsers { get; set; }
public virtual User PaidByUser { get; set; }
元素 PaidForUsers 是User对象的集合
public long Id { get; set; }
public long UserId { get; set; }
这里的 Id 是自动生成的,而 UserId 是由代码提供的。
我想要做的是,每当我创建一个新事务时,只有当用户不存在于数据库中时,我才应该创建一个新用户。
我目前正在使用 DbContext.Transactions.Add( new transaction )。这显然会在我每次创建新事务时在数据库中创建一个新用户。
我目前采用的解决方案是仅对尝试执行相同操作的用户实体使用自定义存储过程。但我也收到以下错误
对数据库的更改已成功提交,但在更新对象上下文时出错。ObjectContext 可能处于不一致的状态。内部异常消息:AcceptChanges 无法继续,因为对象的键值与 ObjectStateManager 中的另一个对象冲突。在调用 AcceptChanges 之前确保键值是唯一的。
这是存储过程 -
ALTER PROCEDURE [dbo].[InsertUser]
(@UserId bigint )
AS
declare @val bigint
declare @countza int
SELECT @val= Id FROM dbo.Users1 where UserId = @UserId
set @countza = @@Rowcount
if @countza = 0
begin
insert into dbo.Users1 (UserId) values (@UserId)
select [Id] from [dbo].[Users1]
where @@ROWCOUNT > 0 and [Id] = scope_identity()
end
else
begin
SELECT 'Id' = @val
end
有人能说出最好的方法是什么吗?创建存储过程是正确的方法吗?