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

移行を作成し、データベースを更新しようとした後、私は次のエラーを取得しています:MVC5 EF6.1コードまず外部キー制約

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

私の目標は*名前IDのすべてが名テーブルへの外部キーです「人」のテーブルを持つことである...その結果、移行コードです。ただし、FirstNameのみが必要です。私が最初にこれをテストしたとき、FirstNameIDに外部キーしかないので、うまくいきました。しかし、私が他の名前に同じものをコピー/貼り付けたとき、今のところ私はここにいるのです。

何かすべての助けがありがとうございます。どうもありがとうございました。

答えて

0

カスケード削除は、流暢な設定でのみオフにすることができます。あなたは何の関係many-to-manyが、3体のone-to-many関係を持っていないので、しかし、あなたは

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

を試したことは、効果がありません。代わりに、各関係を別々に設定する必要があります。

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

私はそれを却下する前に何か試してみるべきです。 "HasRequired"を持っていた人は、IDのために[必須]が必要だと思っていましたが、2人はそうではなかったので、私はそれがうまくいくとは思っていませんでした。お手伝いいただきありがとうございます。 – XstreamINsanity