【问题标题】:MVC5 EF6.1 Code First Foreign Key ConstraintMVC5 EF6.1 代码优先外键约束
【发布时间】:2016-05-28 15:03:24
【问题描述】:
public class Names
{
    [Key]
    public int NameID { get; set; }
    [StringLength(100)]
    [Index(IsUnique = true)]
    [Required]
    public string Name { get; set; }
}

public class People
{
    [Key]
    public int PeopleID { get; set; }
    [Required]
    public int FirstNameID { get; set; }
    [ForeignKey("FirstNameID")]
    public Names FirstName { get; set; }
    public int MiddleNameID { get; set; }
    [ForeignKey("MiddleNameID")]
    public Names MiddleName { get; set; }
    public int LastNameID { get; set; }
    [ForeignKey("LastNameID")]
    public Names LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
}

创建迁移并尝试更新数据库后,我收到以下错误:

Introducing FOREIGN KEY constraint 'FK_dbo.People_dbo.Names_LastNameID' on table 'People' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

无法创建约束或索引。查看以前的错误。

根据我在网上看到的其他文章,我在上下文中添加了以下内容,但它并没有达到我想要的效果。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    }

这是生成的迁移代码...

namespace MyDataSet.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class PeopleNameIDs : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Names",
                c => new
                    {
                        NameID = c.Int(nullable: false, identity: true),
                        Name = c.String(nullable: false, maxLength: 100),
                    })
                .PrimaryKey(t => t.NameID)
                .Index(t => t.Name, unique: true);

            CreateTable(
                "dbo.People",
                c => new
                    {
                        PeopleID = c.Int(nullable: false, identity: true),
                        FirstNameID = c.Int(nullable: false),
                        MiddleNameID = c.Int(nullable: false),
                        LastNameID = c.Int(nullable: false),
                        DateOfBirth = c.DateTime(nullable: false),
                    })
                .PrimaryKey(t => t.PeopleID)
                .ForeignKey("dbo.Names", t => t.FirstNameID, cascadeDelete: true)
                .ForeignKey("dbo.Names", t => t.LastNameID, cascadeDelete: true)
                .ForeignKey("dbo.Names", t => t.MiddleNameID, cascadeDelete: true)
                .Index(t => t.FirstNameID)
                .Index(t => t.MiddleNameID)
                .Index(t => t.LastNameID);

        }

        public override void Down()
        {
            DropForeignKey("dbo.People", "MiddleNameID", "dbo.Names");
            DropForeignKey("dbo.People", "LastNameID", "dbo.Names");
            DropForeignKey("dbo.People", "FirstNameID", "dbo.Names");
            DropIndex("dbo.People", new[] { "LastNameID" });
            DropIndex("dbo.People", new[] { "MiddleNameID" });
            DropIndex("dbo.People", new[] { "FirstNameID" });
            DropIndex("dbo.Names", new[] { "Name" });
            DropTable("dbo.People");
            DropTable("dbo.Names");
        }
    }
}

我的目标是创建一个“People”表,其中所有 *NameID 都是 Names 表的外键。但是,只有 FirstName 是必需的。当我第一次对此进行测试时,我只有 FirstNameID 上的外键,它工作正常。但是当我将相同的内容复制/粘贴到其他名称时,这就是我现在所处的位置。

我们不胜感激。非常感谢。

【问题讨论】:

    标签: asp.net-mvc ef-code-first foreign-keys entity-framework-6


    【解决方案1】:

    只有通过流畅的配置才能关闭级联删除。但是,您已经尝试过

    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    

    没有效果,因为您没有many-to-many 关系,而是3 个one-to-many 关系。相反,您应该分别配置每个关系:

    modelBuilder.Entity<People>()
        .HasRequired(p => p.FirstName)
        .WithMany()
        .HasForeignKey(p => p.FirstNameID)
        .WillCascadeOnDelete(false);
    
    modelBuilder.Entity<People>()
        .HasRequired(p => p.MiddleName)
        .WithMany()
        .HasForeignKey(p => p.MiddleNameID)
        .WillCascadeOnDelete(false);
    
    modelBuilder.Entity<People>()
        .HasRequired(p => p.LastName)
        .WithMany()
        .HasForeignKey(p => p.LastNameID)
        .WillCascadeOnDelete(false);
    

    【讨论】:

    • 我应该在关闭它之前尝试一些东西。我认为所有具有“HasRequired”的人都需要一个 [Required] 作为 ID,而由于其中两个不需要,我认为它不会起作用。非常感谢您的帮助。
    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多