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, он работал нормально. Но когда я копирую/вставляю то же самое в другие имена, ну, вот где я сейчас.
Любая помощь приветствуется. Большое спасибо.
Я должен попробовать что-то, прежде чем уволить его. Все, у кого было «HasRequired», я предположил, что для ID необходимо [Требуется], и поскольку двух из них не было, я не думал, что это сработает. Большое спасибо за вашу помощь. – XstreamINsanity