[英]How to turn off cascade delete in Entity Framework Core 1.0 RTM
嗨,我有帶有Entity Framework Core 1.0 RTM和SQL Server的MVC 6應用程序,當我嘗試生成數據庫表時,出現“引入FOREIGN KEY約束可能導致循環或多個級聯路徑”錯誤。
我的模型類如下:
類別模型:
public class Category
{
public Category()
{
this.VariableSettings = new List<VariableSetting>();
}
public int CategoryId { get; set; }
public string CategoryName { get; set; }
public List<VariableSetting> VariableSettings { get; set; }
public List<Station> Stations { get; set; }
}
站台型號:
public class Station
{
public int StationId { get; set; }
public string StationName { get; set; }
public double? Longitude { get; set; }
public double? Latitude { get; set; }
public List<VariableRecord> VariableRecords { get; set; }
public int CategoryID { get; set; }
public Category Category { get; set; }
}
VariableRecord模型:
public class VariableRecord
{
[Key]
public int VariableRecordId { get; set; }
public double Value { get; set; }
public DateTime RecordDate { get; set; }
public int StationId { get; set; }
public Station Station { get; set; }
public int VarSettingId{ get; set; }
public virtual VariableSetting VariableSetting { get; set; }
}
變量設置模型:
public class VariableSetting
{
[Key]
public int VarSettingId { get; set; }
public int Sequence { get; set; }
public double? MinimumValue { get; set; }
public double? MaximumValue { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
public int VariableId { get; set; }
public Variable Variable { get; set; }
public List<VariableRecord> VariableRecords { get; set; }
}
可變模型:
public class Variable
{
public int VariableId { get; set; }
public string VariableName { get; set; }
public string Description { get; set; }
public string Unit { get; set; }
public List<VariableSetting> VariableSettings { get; set; }
}
因此,我的代碼Category-> Station-> VariableRecord和Category-> VariableSetting-> VariableRecord中也有Cascade刪除路由,因此我嘗試使用Fluent API將上下文類別中的路由Category-> VariableSetting-> VariableRecord禁用。下面:
builder.Entity<VariableRecord>()
.HasOne(pt => pt.VariableSetting)
.WithMany(p => p.VariableRecords)
.HasForeignKey(pt => pt.VarSettingId)
.OnDelete(DeleteBehavior.Cascade);
但是我仍然得到如下:
System.Data.SqlClient.SqlException(0x80131904):在表'VariableSetting'上引入FOREIGN KEY約束'FK_VariableSetting_Category_CategoryId'可能會導致循環或多個級聯路徑。請指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
我已經在這些代碼上停留了幾天,但仍然無濟於事,請幫助!
使用DeleteBehavior.Restrict
而不是DeleteBehavior.Cascade
。
您已經有多個級聯路徑,因此,如果要(確定,您需要)禁用其中之一的級聯,請使用DeleteBehavior.Restrict
。
如果遵循命名約定,則只需要類定義和一些注釋(使用EF Core 1.0.1)
public class Category
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
//[InverseProperty( nameof( VariableSetting.Category ) )]
public virtual ICollection<VariableSetting> VariableSettings { get; set; }
= new List<VariableSetting>();
//[InverseProperty( nameof( Station.Category ) )]
public virtual ICollection<Station> Stations { get; set; }
= new List<Station>();
}
public class Station
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public double? Longitude { get; set; }
public double? Latitude { get; set; }
//[InverseProperty( nameof( VariableRecord.Station ) )]
public virtual ICollection<VariableRecord> VariableRecords { get; set; }
= new List<VariableRecord>();
[Required]
public int CategoryId { get; set; }
//[ForeignKey( nameof( CategoryId ) )]
public virtual Category Category { get; set; }
}
public class VariableRecord
{
[Key]
public int Id { get; set; }
public double Value { get; set; }
public DateTime RecordDate { get; set; }
[Required]
public int StationId { get; set; }
//[ForeignKey( nameof( StationId ) )]
public virtual Station Station { get; set; }
[Required]
public int VariableSettingId { get; set; }
//[ForeignKey( nameof( VariableSettingId ) )]
public virtual VariableSetting VariableSetting { get; set; }
}
public class VariableSetting
{
[Key]
public int Id { get; set; }
public int Sequence { get; set; }
public double? MinimumValue { get; set; }
public double? MaximumValue { get; set; }
[Required]
public int CategoryId { get; set; }
//[ForeignKey( nameof( CategoryId ) )]
public virtual Category Category { get; set; }
[Required]
public int VariableId { get; set; }
//[ForeignKey( nameof( VariableId ) )]
public virtual Variable Variable { get; set; }
//[InverseProperty( nameof( VariableRecord.VariableSetting ) )]
public virtual ICollection<VariableRecord> VariableRecords { get; set; }
= new List<VariableRecord>();
}
public class Variable
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public string Description { get; set; }
public string Unit { get; set; }
//[InverseProperty( nameof( VariableSetting.Variable ) )]
public virtual ICollection<VariableSetting> VariableSettings { get; set; }
= new List<VariableSetting>();
}
如果要使用其他名稱,請取消注釋所有注釋並修復名稱。
創建的(SQLite)sql結構為
PRAGMA foreign_keys = false;
-- ----------------------------
-- Table structure for "Categories"
-- ----------------------------
DROP TABLE IF EXISTS "Categories";
CREATE TABLE "Categories" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_Categories" PRIMARY KEY AUTOINCREMENT,
"Name" TEXT NOT NULL
);
-- ----------------------------
-- Table structure for "Stations"
-- ----------------------------
DROP TABLE IF EXISTS "Stations";
CREATE TABLE "Stations" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_Stations" PRIMARY KEY AUTOINCREMENT,
"CategoryId" INTEGER NOT NULL,
"Latitude" REAL,
"Longitude" REAL,
"Name" TEXT NOT NULL,
CONSTRAINT "FK_Stations_Categories_CategoryId" FOREIGN KEY ("CategoryId") REFERENCES "Categories" ("Id") ON DELETE CASCADE
);
-- ----------------------------
-- Table structure for "Variable"
-- ----------------------------
DROP TABLE IF EXISTS "Variable";
CREATE TABLE "Variable" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_Variable" PRIMARY KEY AUTOINCREMENT,
"Description" TEXT,
"Name" TEXT NOT NULL,
"Unit" TEXT
);
-- ----------------------------
-- Table structure for "VariableRecord"
-- ----------------------------
DROP TABLE IF EXISTS "VariableRecord";
CREATE TABLE "VariableRecord" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_VariableRecord" PRIMARY KEY AUTOINCREMENT,
"RecordDate" TEXT NOT NULL,
"StationId" INTEGER NOT NULL,
"Value" REAL NOT NULL,
"VariableSettingId" INTEGER NOT NULL,
CONSTRAINT "FK_VariableRecord_Stations_StationId" FOREIGN KEY ("StationId") REFERENCES "Stations" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_VariableRecord_VariableSetting_VariableSettingId" FOREIGN KEY ("VariableSettingId") REFERENCES "VariableSetting" ("Id") ON DELETE CASCADE
);
-- ----------------------------
-- Table structure for "VariableSetting"
-- ----------------------------
DROP TABLE IF EXISTS "VariableSetting";
CREATE TABLE "VariableSetting" (
"Id" INTEGER NOT NULL CONSTRAINT "PK_VariableSetting" PRIMARY KEY AUTOINCREMENT,
"CategoryId" INTEGER NOT NULL,
"MaximumValue" REAL,
"MinimumValue" REAL,
"Sequence" INTEGER NOT NULL,
"VariableId" INTEGER NOT NULL,
CONSTRAINT "FK_VariableSetting_Categories_CategoryId" FOREIGN KEY ("CategoryId") REFERENCES "Categories" ("Id") ON DELETE CASCADE,
CONSTRAINT "FK_VariableSetting_Variable_VariableId" FOREIGN KEY ("VariableId") REFERENCES "Variable" ("Id") ON DELETE CASCADE
);
-- ----------------------------
-- Indexes structure for table "Stations"
-- ----------------------------
CREATE INDEX "IX_Stations_CategoryId" ON "Stations" ("CategoryId");
-- ----------------------------
-- Indexes structure for table "VariableRecord"
-- ----------------------------
CREATE INDEX "IX_VariableRecord_StationId" ON "VariableRecord" ("StationId");
CREATE INDEX "IX_VariableRecord_VariableSettingId" ON "VariableRecord" ("VariableSettingId");
-- ----------------------------
-- Indexes structure for table "VariableSetting"
-- ----------------------------
CREATE INDEX "IX_VariableSetting_CategoryId" ON "VariableSetting" ("CategoryId");
CREATE INDEX "IX_VariableSetting_VariableId" ON "VariableSetting" ("VariableId");
PRAGMA foreign_keys = true;
如您所見,無需關閉層疊刪除:o)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.