2014-06-24 34 views
0

我有以下幾點:插入新的父對象時,是否阻止EF添加新的子對象而不僅僅是關聯?

public int CreateExercise(Exercise newExercise) { 

     db.Exercises.Add(newExercise); 
     db.SaveChanges(); 
     return newExercise.ExerciseId; 
    } 

在哪裏練習如下:

public class Exercise { 

    public Exercise() { 
     Users = new Collection<User>(); 
    } 

    [Key] 
    [Required] 
    public int ExerciseId { get; set; } 

    [StringLength(300, ErrorMessage = "The value cannot exceed 300 characters. ")] 
    public string Title { get; set; } 

    public virtual ICollection<User> Users{ get; set; } 
} 

當我創建一個新的練習,有時預先存在的用戶都用它,身份證包括在內。即使對這些Users指定了現有的UserId,也會在此處添加新的User條目。我只想添加關聯,而不是新用戶 - 我會想象EF足夠聰明,能夠解決這個問題嗎?我究竟做錯了什麼?

我只是想避免讓所有附加到新練習的用戶循環,在Add ing之前清除它們,確保它們存在,添加練習,然後添加每個單獨的用戶,最後調用SaveChanges

+0

「運動」實例是如何創建和初始化的?英孚不會將相關項目添加到新實體,除非您確實會導致該項目。 –

+0

@AndrewBarber從客戶端連同相關的預存用戶序列化 – SB2055

+1

Ahh;我誤解了你。我手頭沒有,但這是做這樣的協會的問題。你正在做一個'Add()',所以除非你告訴EF一些不同的東西,否則它假定整個對象圖需要作爲新項添加到數據庫 - 如果那些其他實體沒有被跟蹤。有一些事情可以表明相關記錄不會被添加,但只是關聯......不記得正在進行...... –

回答

2

當斷開連接的實體重新連接時,它們默認處於「已添加」狀態。

您可以在附加練習後更改狀態。

public int CreateExercise(Exercise newExercise) { 

    db.Exercises.Add(newExercise); 

    // set all attached users to unchanged. 
    db.ChangeTracker.Entries<User>().ToList().ForEach(p => p.State = EntityState.Unchanged); 

    db.SaveChanges(); 
    return newExercise.ExerciseId; 
} 
相關問題