Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用modelbuilder创建复合键时列名无效_C#_Asp.net Mvc_Entity Framework_Dbcontext - Fatal编程技术网

C# 使用modelbuilder创建复合键时列名无效

C# 使用modelbuilder创建复合键时列名无效,c#,asp.net-mvc,entity-framework,dbcontext,C#,Asp.net Mvc,Entity Framework,Dbcontext,我正在使用EF 6,试图绕过此错误消息: 操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象 我读过关于在dbcontext中使用modelbuilder创建复合键来解决此问题的解决方案:(不是文章本身,而是第一条注释) 无论如何,生活是美好的,我有一个有各种孩子的父模型,一切都像梦一样工作,直到我试图用一个本身有孩子的子对象来实现这一点。以下是我

我正在使用EF 6,试图绕过此错误消息:

操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象

我读过关于在dbcontext中使用modelbuilder创建复合键来解决此问题的解决方案:(不是文章本身,而是第一条注释)

无论如何,生活是美好的,我有一个有各种孩子的父模型,一切都像梦一样工作,直到我试图用一个本身有孩子的子对象来实现这一点。以下是我的模型的缩写版本:

public class StateYear
{
    public long stateYearId { get; set; }
    public string year { get; set; }
    ...

    public virtual ICollection<Plan> Plans { get; set; }
    public virtual ICollection<ReportAssignment> ReportAssignments { get; set; }
}

public class Plan
{
    public long planId { get; set; }
    public long stateYearId { get; set; }
    ...

    public virtual StateYear StateYear { get; set; }
}

public class ReportAssignment
{
    public long reportAssignmentId { get; set; }
    public long stateYearId { get; set; }
    ...

    public virtual StateYear StateYear { get; set; }
    public virtual ICollection<McoPihpAssignment> McoPihpAssignments { get; set; }
}

public class McoPihpAssignment
{
    public long mcoPihpAssignmentId { get; set; }
    public long reportAssignmentId { get; set; }
    ...

    public virtual ReportAssignment ReportAssignment { get; set; }
}
我知道这是来自ReportAssignment上的modelbuilder,在那里我创建了复合键,因为当我注释它时,或者当我注释ReportAssignment模型上的mcopipAssignment集合时,它也会工作。我只是还没有找到解决这个错误的方法,也不知道为什么这个错误会出现在现在,当它在计划中运行良好的时候。任何帮助或建议都将不胜感激!谢谢大家!

更新所以我发现它对Plan很有效,因为Plan没有任何子项在寻找它的复合键。因此,看起来McoPihpAssignment正在查找ReportAssignment上的复合键属性reportAssignmentId和stateYearId。我找到了EF生成的SQL代码,它在其中调用触发错误的这些属性:

SELECT 
[Project1].[stateId] AS [stateId], 
[Project1].[year] AS [year], 
[Project1].[reportAssignmentId] AS [reportAssignmentId], 
[Project1].[stateYearId1] AS [stateYearId1], 
[Project1].[mcoPihpAssignmentId] AS [mcoPihpAssignmentId], 
[Project1].[reportAssignmentId1] AS [reportAssignmentId1], 
[Project1].[ReportAssignment_reportAssignmentId] AS [ReportAssignment_reportAssignmentId], 
[Project1].[ReportAssignment_stateYearId] AS [ReportAssignment_stateYearId]
FROM ( ... )  AS [Project1]

无论如何,我想我的新问题是,有没有一种方法可以在mcopipassignment或ReportAssignment模型上添加或修饰属性,以便它识别我在modelbuilder中的ReportAssignment上创建的复合键

您是否尝试过在您的模型创建中实现从左到右键的实现?请首先尝试
modelBuilder.Entity().HasRequired(d=>d.Administrator).WithMany().WillCascadeOnDelete(false)只需重命名实体,就像在模型中一样。尝试先打开CascadeOnDelete。如果它工作正常,那么您可以删除它,然后转到
MapLeft
MapRight
我不熟悉使用从左到右键实现。。。在测试上面的代码时,d.Administrator也会提到什么,那会是McoPihpAssignments集合吗?谢谢你的帮助!我能说的最好的事情就是我以前也有同样的问题。但是更多关于你目前拥有的表格。唯一帮助我的是理解约束以及需要创建modelBuilder的原因<代码>http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application
它会告诉您为什么会出现这种错误,您可以先做什么。移除级联删除。因为EF。将从已放弃键约束的其他表中删除数据。现在,了解modelBuild以绕过错误。这将对未来如何制定模型战略有很大帮助。不仅针对代码优先,还针对如何高效检索数据。你只需要从头到尾花点时间来阅读。
  Message=Invalid column name 'ReportAssignment_reportAssignmentId'. 
  Invalid column name 'ReportAssignment_stateYearId'.
SELECT 
[Project1].[stateId] AS [stateId], 
[Project1].[year] AS [year], 
[Project1].[reportAssignmentId] AS [reportAssignmentId], 
[Project1].[stateYearId1] AS [stateYearId1], 
[Project1].[mcoPihpAssignmentId] AS [mcoPihpAssignmentId], 
[Project1].[reportAssignmentId1] AS [reportAssignmentId1], 
[Project1].[ReportAssignment_reportAssignmentId] AS [ReportAssignment_reportAssignmentId], 
[Project1].[ReportAssignment_stateYearId] AS [ReportAssignment_stateYearId]
FROM ( ... )  AS [Project1]