MVC5 EF6.1 代码第一个外键约束


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

我的目标是有一个"人员"表,其中所有 *NameID 都是名称表的外键。但是,只需要名字。当我第一次测试它时,我只有 FirstNameID 上的外键,它工作正常。但是当我将相同的内容复制/粘贴到其他名称时,这就是我现在所处的位置。

感谢任何和所有的帮助。谢谢。

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

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

最新更新