实体框架的核心甚至不能标注
我已经煮下来到一个相当小的用例解决逆特性:实体框架的核心甚至不能标注
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; }
}
工作!哇,我认为这个2.0的名字可能可以用于制作,但事实的存在让我害怕我会遇到什么其他的漏洞。 – sheamus