【问题标题】:How do I make this Code First relationship not required如何使这种 Code First 关系不需要
【发布时间】:2015-11-19 20:54:32
【问题描述】:

在此应用程序的 Code First 中,我将外键定义为可为空的。但是,当我尝试添加没有该键的记录时,我仍然收到外键约束错误:

INSERT 语句与 FOREIGN KEY 约束“FK_dbo.RequestReview_dbo.CustomForm_ReviewFormId”冲突。数据库\"Mkp\",表\"dbo.CustomForm\",列'CustomFormId'发生冲突。\r\n语句已终止。

我应该如何定义关系以便不强制执行键约束?

我的代码优先模型定义如下字段:

[Key, ForeignKey("Resource"), DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid RequestReviewId { get; set; } // My Primary Key
public virtual Resource Resource { get; set; }

public Guid? ReviewFormId { get; set; } // Foreign Key
[ForeignKey("ReviewFormId")]
public CustomForm ReviewForm { get; set; }

(我确实尝试过搜索,但我不确定我搜索的术语是否正确。)

编辑/更新:
如果我删除 ForeignKey 标记,我仍然会尝试创建关系进行迁移,但这次称为ReviewForm_CustomFormId。我怎样才能避免这种情况?

模型的更新版本:

[Key, ForeignKey("Resource"), DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid RequestReviewId { get; set; } // My Primary Key
public virtual Resource Resource { get; set; }

public Guid? ReviewFormId { get; set; } // Foreign Key
public CustomForm ReviewForm { get; set; }

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    给它一个单独的主键字段以及你的外键:

    public int ID { get; set; }
    public Guid? ReviewFormId { get; set; }
    [ForeignKey("ReviewFormId")]
    public CustomForm ReviewForm { get; set; }
    

    这样做我能够插入具有空ReviewFormId 的记录。

    【讨论】:

    • 抱歉,我有一个主键,只是没有在示例中显示。我在上面的示例中添加了我正在使用的密钥。这不是答案。
    【解决方案2】:

    我看到的一个解决方案是您可以将此列 ReviewFormId 用作隐式外键。我的意思是:不要将其定义为外键,而是将其定义为常规数据,只有您会知道其中的数据代表外键,但不要告诉实体它是外键,因为 GUID只是不接受可为空的外键。

    【讨论】:

    • 我希望有更好的方法。此外,如果我删除 ForeignKey 属性,迁移希望创建一个新列 ReviewForm_CustomFormId ,它将具有相同的外键完整性。
    • 为了清楚起见,您可以拥有可为空的外键。问题在于 GUID。 stackoverflow.com/questions/26000345/…
    • @SteveGreene 你的权利,当然你可以有可以为空的外键,但这并不真正匹配使用实体框架,我已经经历过这个问题一百次了,如果你发现任何使 GUID 工作的更好方法,请把链接放在这里!
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多