集合参数'foreignKeyPropertyNames'必须至少包含一个元素

时间:2018-02-20 15:50:12

标签: sql-server asp.net-core .net-core entity-framework-core ef-core-2.0

我有两个具有某些属性的模型:

public class Issue {
    public int Id { get; set; } 
}

public class Action {
    public int Id { get; set; } 
}

这是最后一个有效的代码。然后,当我忘记将问题作为外键属性添加到Action时,我做了它,它变成了:

public class Action {
    public int Id { get; set; } 
    public Issue Issue { get; set; }
    public int IssueId { get; set; }
}

构建解决方案,创建迁移方法并且ef更新数据库失败,并显示以下错误:

  

应用迁移'20180220102738_Action.issue'。执行失败   DbCommand(20ms)[Parameters = [],CommandType ='Text',   CommandTimeout = '30'] ALTER TABLE [Actions] ADD CONSTRAINT   [FK_Actions_Issues_IssueId] FOREIGN KEY([IssueId])参考文献   [问题]([Id])ON DELETE CASCADE; System.Data.SqlClient.SqlException   (0x80131904):引入FOREIGN KEY约束   表''Actions'上的'FK_Actions_Issues_IssueId'可能导致循环或   多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO   ACTION,或修改其他FOREIGN KEY约束。

然后我尝试将onDelete:ReferentialAction.Cascade更改为onDelete:ReferentialAction.SetNull或其他任何东西,但没有任何工作,顺便说一下我不明白它可能是什么问题,这将是这个表上的第三个外键。

我的下一步是删除上次迁移,但它开始抱怨以下内容:

  

System.ArgumentException:集合参数   'foreignKeyPropertyNames'必须至少包含一个元素。在   Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty [T](IReadOnlyList 1 value, String parameterName) at Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceCollectionBuilder 2.HasForeignKey(字符串[]   foreignKeyPropertyNames)at   ISSupport.Models.ISSupportContext<> c.b__69_7(EntityTypeBuilder`1   b)在

我可以回滚到最后一次提交但我不知道我做了什么以及在下一轮应该避免什么。谷歌没有帮助解决这个错误。 .NET Core 2.0 EF Core 2.0 Sql Server 13.0.1742

更新 我不得不做回滚并再次添加外键。它再次抱怨多个级联路径,现在我在迁移Up()方法中将其更改为onDelete: ReferentialAction.NoAction并成功运行更新。我不知道我之前有什么f *#!d之前仍然需要解释为什么我必须设置ReferentialAction.NoAction

2 个答案:

答案 0 :(得分:0)

这是你必须要做的:

public class Issue
{
    public int Id { get; set; }
}

public class Action
{
    public int Id { get; set; }

    [ForeignKey("IssueId")]
    public Issue Issue { get; set; }
    public int IssueId { get; set; }
}

您必须定义什么是您的外键属性。

答案 1 :(得分:0)

在迁移Up()方法中,我不得不将外键ReferentialAction切换为onDelete: ReferentialAction.NoAction