实体框架的核心甚至不能标注

问题描述:

我已经煮下来到一个相当小的用例解决逆特性:实体框架的核心甚至不能标注

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

没有什么了解这里,因为你的数据注解是完全有效的。

问题的原因更加微不足道--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