2017-09-04 66 views
3

當我嘗試更新已從數據庫獲得的實體的相關實體時出現錯誤。爲了便於說明我有這方面的entites:EF核心 - 添加相關實體時出錯

class Car 
{ 
    int Id ..; 
    string Name ..; 
    virtual ICollection<TireCar> tires ...; 
} 

class TireCar 
{ 
    int Id ..; 
    int TireId ..; 
    int CarId..; 
    int Size..; 
    virtual TireBrand tire; 
    virtual Car car; 
} 

class TireBrand 
{ 
    int Id; 
    string Name ..; 
} 

所以,我想打個補丁的方法,讓我更新Car數據,並且還添加,更新或刪除tires。當我得到Car實體時,發生問題,之後我添加一個Tire。類似的東西:

void UpdateCar() 
    { 
     var car = carService.Get(...); 

     ... 

     carService.AddTire(new TireCar{ CarId = car.Id, TireId = 1 }); 

     ... 
    } 

我使用的是DI Repository模式,所以背景是一樣的。即拋出的錯誤是:

System.InvalidOperationException:實體類型「汽車」和「TireCar」之間的關聯已被切斷,但這種關係的外鍵不能設置爲null。如果從屬實體應該被刪除,則建立關係以使用級聯刪除。'

我想,工作兩件事情,但我覺得是不是解決辦法:

  • 當我加入了輪胎後拿到車
  • 當我拿到車,因爲沒有跟蹤

爲什麼會發生如果我正在更新另一個表?我能做些什麼來解決這個問題?

回答

0

您的問題實際上是一個配置問題,而不是EF Core的問題。仔細閱讀錯誤說什麼:

實體類型「汽車」和「TireCar」之間的關聯已被切斷,但這種關係外鍵不能設置爲null。如果應刪除從屬實體,則將關係設置爲使用級聯刪除。

實體框架Core默認情況下(.NET Core 2.0轉發)a SET NULL策略當一個從屬實體變成孤立時。如果我們仔細查看TireCar模型,則不會將CarId屬性設置爲可空,所以該列不能設置爲空。

你有太多不同的解決方案來解決這個問題。如果您希望TireCar實體在您從Car實體中刪除時刪除,則可以通過設置級聯刪除此關係(您也可以更改EF Core默認策略)。這可以通過FluentApi在您的DbContext中設置。

class MyContext : DbContext 
{ 
    // Your DbSets 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<TireCar>() 
      .HasOne(tc => tc.car) 
      .WithMany(car => car.tires) 
      .OnDelete(DeleteBehavior.Cascade); 
    } 
} 

另一種解決方案是讓TireCar實體必須在CarIdnull值,簡單地改變你這樣的實體模型。

class TireCar 
{ 
    public int Id { get; set; } 
    public int TireId { get; set; } 
    public int? CarId { get; set; } 
    public int Size { get; set; } 
    public virtual TireBrand tire { get; set; } 
    public virtual Car car { get; set; } 
} 
+0

我不認爲這是問題所在。我發現了兩個「解決方案」,不會在相同的映射中產生錯誤。爲什麼在調用方法AddTire之後獲得汽車時創建了TireCar?或者爲什麼當我獲得汽車「AsNoTracking」時創建了TireCar? –

+0

當您在添加輪胎後得到汽車時說它起作用,那麼您是否意味着當您再次提出查詢以取回汽車時?我猜你是用別人來取代一些汽車輪胎(這是我想到EF Core爲什麼要用'ClientSetNull'級聯的唯一原因,它會與'AsNoTracking'一起工作,因爲即使你取下汽車輪胎從'Car.tires'屬性中,如果查詢沒有跟蹤更改,則值不會設置爲null。將一些存儲庫代碼添加到您的問題中,以更清楚地說明錯誤的來源。 – jorgonor