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