0

我有表entry和表type。一個entry有一個type一個類型可以在許多條目中(n對1關係)。該類型顯示在可編輯的組合框中。如果用戶輸入一個尚不存在的類型,則應該創建該類型,並且相關的entrytype應該更新爲新的類型實體。添加新的子實體並更新父實體

如何加載項(熱切加載):在所有現有各類

<Combobox IsEditable="True" 
    ItemsSource="{Binding AllTypes, Source={StaticResource typeTableController}}" 
    SelectedValue="{Binding Path="Entry.type"}" /> 

typeTableController有一個屬性(AllTypes):

var entries = dbContext.entry.Include(entry => entry.type).ToList(); 

我如何綁定類型的組合框D B。 Entry是當前選擇的entry。用戶現在可以編輯ComboBox文本。如果他按下「保存」按鈕,則應該將該類型添加到數據庫(如果尚未存在),或者應該在存在的情況下選擇它。並且應該保存更新的條目。如果我不必自己處理每個房產,那將是非常好的,因爲type不是我唯一的房產。

我的第一個方法:

dbContext.Set(entry.getType()).Attach(entry); 
dbContext.SaveChanges(); 

- >出現InvalidOperationException:參照完整性約束違規

dbContext.Entry(formEntry.type).State = EntityState.Added; 
dbContext.Set(entry.getType()).Add(entry); 
dbContext.SaveChanges(); 

- >添加新type到類型表,但也複製類型/入口表中的所有類型和條目(這對於我),只更新現在兩個現有的entries之一的類型到新的type。因此,如果有前10種,現在有21

編輯:我的條目:

public partial class entry 
{ 
    ... 
    public Nullable<int> type_id { get; set; } 
    ... 
    public virtual type type { get; set; } 
} 

重要: 我總是得到崩潰,當我嘗試

dbContext.Entry(entry).State = EntityState.Modified; 

原因是,我的調試器監視列表中有entry。看來這會導致一些衝突。刪除它可以解決這個問題。

回答

1

確定類型是否是現有的或用戶添加的新類型。檢查type.Id == 0新類型的實體。

if (typeFromCombobox.Id == 0){ 
    //new type added 
    dbContext.Set<type>().Add(typeFromCombobox) 
} 
entity.type = typeFromCombobox // EF should handle this if you didn't call 'Detach' before 
dbContext.SaveChanges() 

編輯:不知道這一點:您正在使用組合框的結合應該自動改變entity.type當用戶選擇它。所以線entity.type = typeFromCombobox是rebundant

編輯2:我創建sample code

它工作正常,並且兩個entity.typeidentity.type.id進行後SaveChanges呼叫

更新,但如果我取消this.Configuration.AutoDetectChangesEnabled = false;entity.typeid將不會被更新,直到我手動撥打context.ChangeTracker.DetectChanges();

編輯3:如果在加載和保存之間更改了dbContext,則應該將實體附加到新的上下文中

dbContext.Set<entity>().Attach(entity); 
if (typeFromCombobox.Id == 0){ 
    //new type added 
    dbContext.Set<type>().Add(typeFromCombobox) 
} 
entity.type = typeFromCombobox; 
dbContext.SaveChanges() 
+0

隨着代碼的添加,將添加新類型。但是該條目的外鍵在db中沒有更新。我不確定你的意思是「分離」。我不在加載條目時創建的上下文中。 – L3n95

+0

@ L3n95你的意思是'entry.typeId'外鍵?通常EF在處理導航屬性 –

+0

時應該處理此問題。在更新之前:entry.type_id = 55,entry.type.id = 0;更新後:entry.type_id = 55,entry.type.id = 56 – L3n95