Insert语句与外键约束冲突。实体框架错误

时间:2015-11-01 23:32:18

标签: c# asp.net entity-framework

我正在尝试创建一对多关系,其中TypeOfImmobile可以有一个或更多的Immobile。 这是我的模型类:

public class TypeOfImmobile
{
    public int Id { get; set; }
    [Display(Name = "Type Of Immobile")]
    public string Designation { get; set; }

    public ICollection<Immobile> Immobiles { get; set; }
}

public class Immobile
{
    public int Id { get; set; }
    public int TypeOfImmobileId { get; set; }
    public virtual TypeOfImmobile TypeOfImmobile { get; set; }
}

创建Immobile时出错:

INSERT语句与FOREIGN KEY约束“FK_dbo.Immobiles_dbo.TypeOfImmobiles_TypeOfImmobilesId”冲突。冲突发生在数据库“aspnet-ARQSI-IT2-2015103105205​​6”,表“dbo.TypeOfImmobiles”,列“Id”中。 声明已经终止。

4 个答案:

答案 0 :(得分:1)

您的TypeOfImmobileId属性的类型为int,因此无法将其设置为null。即使您没有为integer分配值,它也等于0而不是null。如果在将create命令发送到SQL时未为TypeOfImmobileId分配值,则SQL将在创建记录的存储过程中将其作为0。并且TypeOfImmobile表可能不包含在主键中带有0值的记录。换句话说,您发送的数据的外键值无效。它与TypeOfImmobile表中的任何主键值都不对应。您的主键不应为空,而外键则应为空。

您应该将TypeOfImmobileId的类型从int更改为Nullable<int>,或者简单地将int?更改。

所以TypeOfImmobileId属性应该是这样的:

public int? TypeOfImmobileId { get; set; }

您无需向ForeignKey属性添加TypeOfImmobileId属性,因为您遵循Code-First conventionsname of Foreign Key matches with name of Primary Key of related entity

您可以在运行SQL Server Profiler时观察到该问题。当应用程序运行将创建记录的命令时,将列出相关的存储过程。

答案 1 :(得分:0)

似乎在创建Immobile时,您可能没有使用有效值设置TypeOfImmobileId属性,即现有Id的{​​{1}} 。

答案 2 :(得分:0)

这是由以下原因之一造成的:

1 - 您没有设置导航属性(TypeOfImmobile)或TypeOfImmobileId

2 - 数据库中不存在TypeOfImmobileId或TypeOfImmobile的值

3 - 也许你在保存TypeOfImmobile之前保存了Immobile

答案 3 :(得分:0)

您需要在新属性ID中设置FK [ForeignKey("Your_FK_ImmobileId")] Your_FK_ImmobileId