0

我已經煮下來到一個相當小的用例解決逆特性:實體框架的核心甚至不能標註

public class ItemRental 
{ 
    [Key] 
    public Int32 ItemRentalId { get; set; } 

    public Int32? OriginatingSalesOrderId { get; set; } 

    [ForeignKey("OriginatingSalesOrderId")] 
    public SalesOrder OriginatingSalesOrder { get; set; } 

    public Int32? DepositCreditedOnSalesOrderId { get; set; } 

    [ForeignKey("DepositCreditedOnSalesOrderId")] 
    public SalesOrder DepositCreditedOnSalesOrder { get; set; } 
} 

public class SalesOrder 
{ 

    [Key] 
    public Int32 SalesOrderId { get; set; } 

    [InverseProperty("OriginatingSalesOrder")] 
    public ICollection<ItemRental> Rentals { get; set; } 


    [InverseProperty("DepositCreditedOnSalesOrder")] 
    public ICollection<ItemRental> Refunds { get; set; } 
} 

public class MyAppDatabase : DbContext 
{ 
    public MyAppDatabase(DbContextOptions<MyAppDatabase> options) : base(options) 
    { 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(x => x.GetForeignKeys())) 
     { 
      relationship.DeleteBehavior = DeleteBehavior.Restrict; 
     } 
     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<ItemRental> ItemRentals { get; set; } 
    public DbSet<SalesOrder> SalesOrders { get; set; } 
} 

試圖運行遷移將給:

系統。 InvalidOperationException:無法確定由類型爲'SalesOrder'的導航屬性'ItemRental.OriginatingSalesOrder'表示的關係。無論是手動配置關係,還是使用'[NotMapped]'屬性或'OnModelCreating'中的'EntityTypeBuilder.Ignore'忽略此屬性。

與EF 6.x完全相同的關係。我確信我可以使用Fluent API來解決這個問題,但我更願意理解如何使用註釋來完成這項工作。

我在這裏發現了一個類似的問題:EntityFramework core model relationship issue while doing Add-Migration但它並沒有解決這個問題。

編輯:樣品溶液的位置:https://drive.google.com/file/d/0BzgvtZfXt8MHd1RseVJubmd6TEU/view?usp=sharing

回答

4

沒有什麼瞭解這裏,因爲你的數據註解是完全有效的。

問題的原因更加微不足道--EFC問題跟蹤器中的#9180 Metadata: InverseProperty fails to resolve ambiguity while use KeyAttribute on PK開放問題跟蹤EF Core 2.0(迴歸)錯誤,計劃在下一個2.1版本中發佈。

在此之前,在鏈接中建議的解決方法是使用流利的API,而且如果你從SalesOrderId財產SalesOrder刪除Key屬性(因爲它幸運地遵循公認的PK公約的一個),它的工作原理:

public class SalesOrder 
{  
    public Int32 SalesOrderId { get; set; }  
    // ... 
} 

,或者如果你申請的集合導航屬性的InverseProperty屬性:

public class ItemRental 
{ 
    // ... 
    [ForeignKey("OriginatingSalesOrderId")] 
    [InverseProperty("Rentals")] 
    public SalesOrder OriginatingSalesOrder { get; set; } 
    // ...  
    [ForeignKey("DepositCreditedOnSalesOrderId")] 
    [InverseProperty("Refunds")] 
    public SalesOrder DepositCreditedOnSalesOrder { get; set; } 
} 
+1

工作!哇,我認爲這個2.0的名字可能可以用於製作,但事實的存在讓我害怕我會遇到什麼其他的漏洞。 – sheamus