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 Code First ограничение внешнего ключа

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

Моя цель состоит в том, чтобы иметь «Люди» стол, где все * NameIDs внешние ключи к таблице имен. Однако требуется только FirstName. Когда я впервые проверил это, и у меня был только внешний ключ на FirstNameID, он работал нормально. Но когда я копирую/вставляю то же самое в другие имена, ну, вот где я сейчас.

Любая помощь приветствуется. Большое спасибо.

ответ

0

Удаление каскада может быть отключено только с плавной конфигурацией. Тем не менее, то, что вы пытались

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

Я должен попробовать что-то, прежде чем уволить его. Все, у кого было «HasRequired», я предположил, что для ID необходимо [Требуется], и поскольку двух из них не было, я не думал, что это сработает. Большое спасибо за вашу помощь. – XstreamINsanity