2015-05-11 79 views
1

我有以下的SQL Server DBEF6沒有更新,只是插入

公司結構 - >分行 - > BranchTelephone - > TelephoneNumber

因此,公司有許多分支其中有許多telephonenumbers。科TelephoneNumber是許多一對多

這裏是實體類:

public class Company 
    { 
     public Company() 
     { 
     this.Branches = new HashSet<Branch>(); 
     } 

     [Key] 
     //identity column in sql server 
     public int Id{ get; set; } 
     public string Name{ get; set; } 
     public virtual ICollection<Branch> Branches{ get; set; } 
    } 

    public partial class Branch 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="Branch"/> class. 
     /// </summary> 
     public Branch() 
     { 
      this.TelephoneNumbers = new HashSet<TelephoneNumber>();   
     } 

     [Column("BranchID")] 
     [Key] 
     public int Id { get; set; } 

     public int CompanyId{ get; set; } 

     public virtual Company Company { get; set; } 

     public virtual ICollection<TelephoneNumber> TelephoneNumbers { get; set; } 
    } 

public partial class TelephoneNumber 
{ 
    public TelephoneNumber() 
    { 
     this.Branches = new HashSet<Branch>(); 
    } 

    [Key] 
    [Column("TelephoneID")] 
    public int Id { get; set; } 

    public virtual ICollection<Branch> Branches { get; set; }  
} 

我嘗試做以下測試設置:

var t1 = new TelephoneNumber(); 
var t2 = new TelephoneNumber(); 
using(var context = new MyDbContext()) 
{ 
    var company = new Company 
    { 
    Name = "C1", 
    Branches = 
    { 
     new Branch 
     { 
     TelephoneNumbers = {t1, t2} 
     } 
    }   
    }; 
    context.SaveChanges(); 
} 

此時看SQAl Server事件探查器和runnign SQL,所有數據是
正確插入

using(var c2 = new MyDbContext()) 
{ 
    var company2 = c2 .Companies.First(x=>x.Name == "C1"); 
    var b1 = company2 .Branches.First(); 

    //data matches what is inserted above 

    b1.TelephoneNumbers.Clear(); 
    b1.TelephoneNumbers.Add(new TelephoneNumber()); 

    company2.Name = "Updated"; 

    c2.SaveChanges(); 
} 

Atfer上面保存更改followign語句獲取一個SQL服務器genrated

1. Update Company set name = "Updated" -- Correct 
2. Delete from BranchTelephone the two entries that were added during first insert 
3. Insert New Company 
4. Insert new Branch 
5. Insert new Telephone Number 
6. Insert new Branch Telephone 
7. Insert new Telephone Number 
8. Insert new Branch Telephone 
9. Insert new Telephone Number 
10. Insert new Branch Telephone 

所以基本上它更新和刪除預期。

但隨後着手從步驟一個重建的一切,讓我總有三個電話號碼,而不是1

我不知道是怎麼回事的。任何幫助,將不勝感激。

謝謝。

我打得周圍,原來

一切都很好,如果我ommit以下行: b1.TelephoneNumbers.Add(新TelephoneNumber());

通過罰我的意思是它更新數據並刪除所有相關的電話號碼就好了。但是,如果我在同樣的背景下做了上面的事情,那麼它會忘記其他所有事情,只是插入每一個新的公司,分支和3個電話號碼(包括兩個刪除的號碼)

這是不可接受的。我在這裏做錯了什麼

+0

您需要將您的子對象標記爲已修改。這是一個痛苦。你也可以使用GraphDiff。 http://stackoverflow.com/questions/24789903/updating-child-entities-in-entity-framework-mvc –

+0

這就是問題所在。其中一個實體來自一個獨立的數據庫上下文實例,因此創建了所有這些。 – ASR

回答

0

問題原來是屬於一個單獨的實例dbcontext的一個實體。所以context1被用來獲取entityA實例,該實例被添加到context2.entityBCollection中,導致EF插入所有內容,而不是僅插入entityA實例。

我認爲它是EF中的某種錯誤,因爲如果entityA沒有附加到contextB,它應該拋出一個異常或者只在數據庫中創建entityA。但是相反,contextB將附加到contextB的對象的整個層次結構的插入發送到數據庫。