2011-03-15 30 views
0

我在SQL Server Management Studio中創建了兩個存儲過程。通過實體框架調用存儲過程後,數據庫中的表更新,但實體保持原樣

第一個過程中ProjcetsToUsers表中添加字段(許多-to-many關聯)

CREATE PROCEDURE sp_addUserToProject 
    @userId int, 
    @projectId int 
AS 
BEGIN 
    SET NOCOUNT ON;    
    IF NOT EXISTS(SELECT * FROM ProjectsToUsers WHERE idProject = @projectId and idUser = @userId) 
     INSERT INTO ProjectsToUsers (idProject, idUser) VALUES (@projectId, @userId)  
END 
GO 

第二個過程,從該表中刪除字段:

CREATE PROCEDURE sp_deleteUserToProject 
    @userId int, 
    @projectId int 
AS 
BEGIN 
    SET NOCOUNT ON;   
    DELETE FROM ProjectsToUsers WHERE idProject = @projectId and idUser = @userId  
END 
GO 

第一功能導入更新的所有日期(以數據庫和會話中的實體):

Entities.AddUserToProject(projectId: project.id, userId: user.id); 

第二函數i M端口在數據庫更新單場=(

bugTrackerEntities.DeleteUserFromProject(projectId: project.id, userId: user.id); 

我試圖刷新的entites:

bugTrackerEntities.Refresh(RefreshMode.StoreWins, project); 
bugTrackerEntities.Refresh(RefreshMode.StoreWins, user); 
bugTrackerEntities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
project.Users.Load(); 
user.Projects.Load(); 

它並沒有幫助=(

我可以從項目中刪除用戶,然後添加另一個,並添加新的,但刪除了遺體。至於數據庫,這個功能正常工作。

爲什麼會發生這種情況?

+0

這些被稱爲**存儲**過程(如存儲在SQL Server中) - **不存儲過程.... – 2011-03-15 14:16:17

回答

1

如果您的應用程序中同時包含用戶和項目實體,則完全不需要這些過程。只需使用:

project.Users.Add(user); 

而且

project.Users.Remove(user); 

之所以出現這種情況是EF不知道關係發生了變化。試試這個刷新關係:

bugTrackerEntities.LoadProperty<Project>(project, p => p.Users, 
    MergeOptions.OverwriteChanges); 

我affraid,它仍然會與刪除關係的問題 - 至少在版本EFv1(.NET 3.5 SP1),它wasn't able to remove existing relation這是不是從數據庫加載。

+0

謝謝,但LoadProperty不是好歹。怎麼樣添加和刪除操作 - 這是行不通的,因爲「EF要求每個表必須有主鍵可更新。在你的情況下,你必須」。 – Str 2011-03-15 16:03:04

+0

是的,它需要如此簡單地修改您的聯結表並添加projectId和userId中的複合鍵。它不會影響數據庫中的任何內容。 – 2011-03-15 16:14:59