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

完美,谢谢! –

相关问题