2017-08-31 79 views
0

我正在以下出現InvalidOperationException當我試圖挽救實體有一個一對一的關係:出現InvalidOperationException由於實體框架的核心循環依賴

System.InvalidOperationException:無法保存更改因爲在數據中檢測到 循環依賴要保存: 'ForeignKey的: DeviceLicenseSubscriptionPlan {' LicenseId '} - > DeviceLicense {' ID '} 獨特ToPrincipal:許可,ForeignKey的:DeviceLicense {' SubscriptionPlanId'} - > DeviceLicenseSubscriptionPlan {'Id'} T oPrincipal:SubscriptionPlan'。

這裏是我的產品型號名稱:

public class DeviceLicense 
{ 
    public Guid? Id { get; set; } 
    public int DeviceLimit { get; set; } 
    public DeviceLicenseSubscriptionPlan SubscriptionPlan { get; set; } = new DeviceLicenseSubscriptionPlan(); 
} 

public class DeviceLicenseSubscriptionPlan 
{ 
    public Guid? Id { get; set; } 
    public Guid? LicenseId { get; set; } 
    public DeviceLicense License { get; set; } 
} 

這裏OnModelCreating()

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    var deviceLicense = modelBuilder.Entity<DeviceLicense>().ToTable("DeviceLicense"); 
    deviceLicense.HasKey(l => l.Id); 
    deviceLicense.HasOne<DeviceLicenseSubscriptionPlan>() 
     .WithOne(s => s.License) 
     .HasForeignKey<DeviceLicenseSubscriptionPlan>(s => s.LicenseId) 
     .HasConstraintName("LicenseId"); 
    deviceLicense.Property(l => l.DeviceLimit).HasColumnName("DeviceLimit"); 

    var deviceLicenseSubPlan = modelBuilder.Entity<DeviceLicenseSubscriptionPlan>().ToTable("DeviceLicenseSubscriptionPlan"); 
    deviceLicenseSubPlan.HasKey(s => s.Id); 
    deviceLicenseSubPlan.Property(s => s.Id).HasColumnName("SubscriptionPlanId"); 


    base.OnModelCreating(modelBuilder); 
} 

我使用EF核心2.0。我可能在模型構建器中做錯了什麼?任何提示?

回答

3

問題是此行

deviceLicense.HasOne<DeviceLicenseSubscriptionPlan>() 

它基本上告訴EF沒有導航屬性DeviceLicenseSubscriptionPlanDeviceLicense。然而,是導航屬性,因此按照慣例EF將其映射到DeviceLicense中指向DeviceLicenseSubscriptionPlan的與FK的第二關係。當然在DeviceLicenseSubscriptionPlan中結合所需的FK會產生一個循環。

確保流利配置使用正確的重載,這些重載完全代表關係兩邊導航屬性的存在/不存在。在這個特例中,用

代替
deviceLicense.HasOne(l => l.SubscriptionPlan) 
+0

完美,謝謝! –