简体   繁体   English

如何在Entity Framework Core 1.0 RTM中关闭级联删除

[英]How to turn off cascade delete in Entity Framework Core 1.0 RTM

Hi I have MVC 6 application with Entity Framework Core 1.0 RTM and SQL server, when I try to generate database tables, I got "Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths" error. 嗨,我有带有Entity Framework Core 1.0 RTM和SQL Server的MVC 6应用程序,当我尝试生成数据库表时,出现“引入FOREIGN KEY约束可能导致循环或多个级联路径”错误。

My model classes are as below: 我的模型类如下:

Category Model: 类别模型:

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

Station Model: 站台型号:

 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 Model: 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; }
}

VariableSetting Model: 变量设置模型:

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

Variable Model: 可变模型:

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

So, there are too Cascade delete routes in my codes Category->Station->VariableRecord and Category->VariableSetting->VariableRecord, so I am trying to diable the route Category->VariableSetting->VariableRecord in the context class with Fluent API as below: 因此,我的代码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);

However I still got same as below: 但是我仍然得到如下:

System.Data.SqlClient.SqlException (0x80131904): Introducing FOREIGN KEY constraint 'FK_VariableSetting_Category_CategoryId' on table 'VariableSetting' may cause cycles or multiple cascade paths.Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. System.Data.SqlClient.SqlException(0x80131904):在表'VariableSetting'上引入FOREIGN KEY约束'FK_VariableSetting_Category_CategoryId'可能会导致循环或多个级联路径。请指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

I have been stuck on these codes for couple of days but still went nowhere, please help! 我已经在这些代码上停留了几天,但仍然无济于事,请帮助!

Use DeleteBehavior.Restrict instead of DeleteBehavior.Cascade . 使用DeleteBehavior.Restrict而不是DeleteBehavior.Cascade

You already have multiple cascade path, so if you want (ok, you need) disable cascading on one of them - use DeleteBehavior.Restrict . 您已经有多个级联路径,因此,如果要(确定,您需要)禁用其中之一的级联,请使用DeleteBehavior.Restrict

If you follow the naming conventions you just need the class definitions and some annotations (using EF Core 1.0.1) 如果遵循命名约定,则只需要类定义和一些注释(使用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>();
}

If you want to have other names, then uncomment all annotations and fix the names. 如果要使用其他名称,请取消注释所有注释并修复名称。

The created (SQLite) sql structure is 创建的(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;

As you can see, there is no need to turn off cascade delete :o) 如您所见,无需关闭层叠删除:o)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM