2012-12-13 131 views
1

我有一個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 MoviePerson有多對多的關係,其中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並忽略它嗎?如果不是,這類問題的最佳做法是什麼?

回答

0

我認爲沒有必要附加Person對象(如果它們已經存在)。

我會做的是循環API Person對象並與EF DbContext進行比較。

var dbPerson = MyMovieContext.Persons.Where(x => x.ID == myPersonID).SingleOrDefault(); 

如果找不到匹配項,則添加。如果你確實找到了一個匹配,那麼用DbContext中的實體替換Character上的引用。

+0

這適用於幾乎所有情況。有些電影可以讓一個人扮演不止一個角色。如果它們不存在於數據庫中,那麼我仍然會得到一個主鍵違規,因爲它從電影中添加每個人,它會從character1插入person1,然後嘗試從character2插入person1,但由於person1現在存在於db中拋出異常。有什麼想法嗎? – bflemi3

+0

在處理character1時插入person1後,它應該在處理character2時從上下文中獲取person1。也許你正在檢查一個人是否存在於代碼中的錯誤位置? –

+0

但是,在更改提交之前,person1將不會存在於數據庫中('SaveChanges()')。 – bflemi3

0

如果您使用DbContext API,則可以使用AddOrUpdate擴展方法。讓我們假設你有一個列表或個人,那麼你可以做:

context.Persons.AddOrUpdate(persons.ToArray()); 

你可能會做這樣每個模型項目(persons是該項目的人),然後用PersonMovie創建Character對象附着物體。

請注意,AddOrUpdate只在上下文中添加或更新。只有SaveChanges提交到數據庫。