entity framework代码首先定义关系/键

我正在使用代码devise我的数据库,我需要一点帮助。

我得到这个错误:

引入表'发票'上的FOREIGN KEY约束'SalesOrder_Invoices'可能会导致循环或多个级联path。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
无法创build约束。 查看以前的错误。

我想要有以下的关系/关键:

--> = 1 to Many Relationship 
  1. 客户 – >客户位置
  2. CustomerLocation – > SalesOrder
  3. SalesOrder – >发票
  4. SalesRep – > SalesOrder
  5. PaymentTerm – >客户
  6. PaymentTerm – > SalesOrder
  7. PaymentTerm – >发票

我试图按照以下标准来定义它们:

 <ClassName><PrimaryKeyID> 

例如: CustomerID属性,所以在CustomerLocation我定义了如下所示的外键:

 Public Property CustomerID AS Integer 

我所要做的就是定义外键是否正确? 我是否也必须为每个我定义的键具有导航属性?

而且,我可以在一个对象的同一个主键上不能有多个外键吗?

更新

所以要定义一个关系,你使用ClassName.PrimaryKeyProperty ? 或者你使用导航属性? 或两者? 困惑!!

更新2

所以要build立一种关系,你必须定义双方……我想。

 Public Class Customer Public Property ID AS Integer Public Overrideable Property Locations AS ICollection(OF CustomerLocation) End Class Public Class CustomerLocation Public Property ID AS Integer Public Property CustomerID AS Integer End Class 

当您有多个级联删除path时,这是由SQL Server引起的exception。 如果你删除你的PaymentTerm,它将触发所有三个关系的级联删除。 创buildSalesOrderInvoice时,这将会炸毁。 EF默认创build与ON DELETE CASCADE所有一对多关系,您可以重新映射您的特定关系,以便不使用它:

 modelBuilder.Entity<...>() .HasRequired(...) .WithMany(...) .HasForeignKey(...) .WillCascadeOnDelete(false); 

或者,你可以通过删除约定来将其全局closures:

 modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

你可以通过编辑生成的Up()方法来解决特定迁移中的这个错误:

 AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true) 

并在违规关系cascadeDelete: value更改为false。

阅读这个 ,我相信这将帮助你find答案。

另外,根据ScottGu的博客post ,我认为一般情况下应该是你创build的类如下(我没有仔细阅读,所以你应该查看更多的细节):

 public class Customer { public int CustomerID { get; set; } public int CustomerLocationID { get; set; } public virtual CustomerLocation Location { get; set; } } public class CustomerLocation { public int CustomerLocationID { get; set; } public virtual ICollection<Customer> Customers { get; set; } }