在DbInitialize类中使用foreign Key。代码优先

时间:2014-03-03 17:05:33

标签: asp.net-mvc-3 ef-code-first

我有两个实体

public class Datatype
{
    [Key]
    public int Id { get; set; }
    [StringLength(96)]
    public string DataTypeName { get; set; }        
}

public class Attribute
{
    [Key]
    public int Id { get; set; }
    [StringLength(96)]
    public string Attribute_Name { get; set; }

    [ForeignKey("Datatype")]
    public int? DatatypeId { get; set; }
    public virtual Datatype Datatype { get; set; }
}

在DataBase Initialize中我有这段代码

    Datatype dt = new Datatype();
    dt.DataTypeName = "text";
    context.datatypes.Add(dt);
//Above code is working fine. And After execution I can see
//in records a row.. with id=1 and datatype=text
    Attribute at = new Attribute();
    at.Attribute_Name = "Description";
    //at.DatatypeId = 1;                   But if I uncomment this line
    context.attributes.Add(at);           // Then This Gives Following Error

The INSERT statement conflicted with the FOREIGN KEY constraint
"FK_dbo.Attributes_dbo.Datatypes_DatatypeId". The conflict occurred in database
"dyescan", table "dbo.Datatypes", column 'Id'

1 个答案:

答案 0 :(得分:1)

假设上述代码在两个对象中的任何一个保存到数据库之前执行,那么它将无法正常工作,因为您的对象'dt'在保存到数据库之前不会有ID为1,因此您不能与'1'上的属性关联!

相反,您不应该设置'DatatypeId',而只需设置'数据类型',如下所示:

at.Datatype = dt;

这将使实体框架能够确定调用savechanges时关联的实际外键应该是什么。