首页 文章

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

提问于
浏览
38

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

我收到此错误:

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

我想尝试以下关系/键:

--> = 1 to Many Relationship
  • 客户 - > CustomerLocation

  • CustomerLocation - > SalesOrder

  • SalesOrder - >发票

  • SalesRep - > SalesOrder

  • PaymentTerm - >客户

  • PaymentTerm - > SalesOrder

  • PaymentTerm - >发票

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

<ClassName><PrimaryKeyID>

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

Public Property CustomerID AS Integer

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

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

Updated

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

Update 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

2 回答

  • 4

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

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

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

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    

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

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

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

  • 97

    阅读this,我相信这会帮助您找到答案 .

    另外,根据ScottGu的blogpost,我认为一般情况下你应该按照以下方式创建类(我没有仔细阅读它,所以你应该查看它以获得更多细节):

    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; }
    }
    

相关问题