实体框架代码首先 - 定义关系/密钥

Sam*_*Sam 38 entity-framework entity-framework-4.1

我首先使用代码设计我的数据库,我想我需要一些帮助.

我收到此错误:

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

我想尝试以下关系/键:

--> = 1 to Many Relationship
Run Code Online (Sandbox Code Playgroud)
  1. 客户 - >客户位置
  2. CustomerLocation - > SalesOrder
  3. SalesOrder - >发票
  4. SalesRep - > SalesOrder
  5. PaymentTerm - >客户
  6. PaymentTerm - > SalesOrder
  7. PaymentTerm - >发票

我试图通过以下标准来定义它们:

<ClassName><PrimaryKeyID>
Run Code Online (Sandbox Code Playgroud)

示例:Customer具有ID属性,因此在CustomerLocation我定义外键时如下:

Public Property CustomerID AS Integer
Run Code Online (Sandbox Code Playgroud)

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

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

更新

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

更新2

因此,为了使关系发挥作用,你必须定义双方......我想.

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
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 97

当您有多个级联删除路径时,这是由SQL Server引起的异常.如果删除PaymentTerm,它将触发所有三个关系的级联删除.创建任何一个SalesOrder或那个时会爆炸Invoice.EF默认情况下会创建与ON DELETE CASCADE您的一对多关系,您可以将您的特定关系重新映射为不使用它:

modelBuilder.Entity<...>()
            .HasRequired(...)
            .WithMany(...)
            .HasForeignKey(...)
            .WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)

或者您可以通过删除约定将其全局关闭:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();   
Run Code Online (Sandbox Code Playgroud)

您可以通过Up()使用如下所示的行编辑生成的方法来解决特定迁移的此错误:

AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true)
Run Code Online (Sandbox Code Playgroud)

cascadeDelete:在违规关系上将该值更改为false.

  • 我喜欢这个'OneToManyCascadeDeleteConvention`提示的答案. (13认同)