2012-05-14 48 views
0

我試圖更新類交易對象的的EntityFramework,控件創建一個新的對象

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是用戶對象的集合

public long Id { get; set; } 
    public long UserId { get; set; } 

這裏Id是自動生成的,UserId是由代碼提供的。

我想要做的是,每當我創建一個新的事務,我應該創建一個新的用戶,只要用戶不存在已經在數據庫中。

我目前使用DbContext.Transactions.Add(新交易)。這顯然會在每次創建新事務時在數據庫中創建一個新用戶。

我目前採用的解決方案是僅爲試圖執行相同操作的用戶實體使用自定義存儲過程。但我也收到以下錯誤

對數據庫的更改已成功提交,但更新對象上下文時發生錯誤。 ObjectContext可能處於不一致的狀態。內部異常消息:由於對象的鍵值與ObjectStateManager中的另一個對象衝突,因此AcceptChanges無法繼續。在調用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 

有一個人能告訴什麼是做到這一點的最好方法是什麼?創建存儲過程是正確的方式嗎?

回答

0

我想說正確的方式 - 「正常」的情況下 - 是使用LINQ:

(我假設UserId必須是唯一的,但不是主鍵(這是Id))

var transaction = context.Transactions.Create(); 
var user = context.Users.SingleOrDefault(u => u.UserId == userId); 
if (user != null) 
    transaction.PaidForUsers.Add(user); 
else 
    transaction.PaidForUsers.Add(new User { UserId = userId }); 
context.Transactions.Add(transaction); 
context.SaveChanges(); 

如果您的操作非常關鍵,那麼正確的方法可能就是存儲過程。

+0

謝謝,你真的救了我的命。 – Tushar