我有一個Movies
的json對象,它傳遞給我的控制器。在實體框架中插入具有多對多關係的新對象
{data : [{
Id: 12345,
Title: 'Movie1',
Year: 2010,
Character: [{
Name: 'Character1',
Person: { Id: 1, Name: 'Person1' }
},{
Name: 'Character2',
Person: { Id: 2, Name: 'Person2' }
}]
}]}
模型綁定工作正常,但我有通過實體框架5.我得到一個主鍵衝突各Person
的電影被插入時,將每個Movie
到數據庫的問題。
我明白爲什麼會發生這種情況。添加新的Movie
時,數據庫中已存在一些人員,以便發生違規行爲。每個人的ID不是自動生成的。我使用的是我從api收到的ID,我從中獲取信息。
A Movie
與Person
有多對多的關係,其中Character
是兩者之間的橋樑。
public class Movie {
public int Id { get; set; }
public string Title { get; set; }
public int? Year { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Movie() {
Characters = new HashSet<Character>();
}
}
public class Character {
public string Name { get; set; }
public virtual Movie Movie { get; set; }
public virtual Person Person { get; set; }
}
public class Person {
public int Id { get;set; }
public string Name { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Person() {
Characters = new HashSet<Character>();
}
}
我的問題是...我知道我可以通過每個Person
對象和循環,如果它存在或Attach()
Add()
,如果它不。 如果實體框架已經存在,實體框架會自動處理插入新的Person
並忽略它嗎?如果不是,這類問題的最佳做法是什麼?
這適用於幾乎所有情況。有些電影可以讓一個人扮演不止一個角色。如果它們不存在於數據庫中,那麼我仍然會得到一個主鍵違規,因爲它從電影中添加每個人,它會從character1插入person1,然後嘗試從character2插入person1,但由於person1現在存在於db中拋出異常。有什麼想法嗎? – bflemi3
在處理character1時插入person1後,它應該在處理character2時從上下文中獲取person1。也許你正在檢查一個人是否存在於代碼中的錯誤位置? –
但是,在更改提交之前,person1將不會存在於數據庫中('SaveChanges()')。 – bflemi3