我正在尝试创建一对多关系,其中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-20151031052056”,表“dbo.TypeOfImmobiles”,列“Id”中。 声明已经终止。
答案 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 conventions和name 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