2015-11-19 18 views
1

在我的代碼優先此應用程序中,我已將外鍵定義爲可空。然而,當我嘗試添加一條記錄沒有那把鑰匙,我仍然得到一個外鍵約束錯誤:如何讓此代碼優先關係不是必需的

The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_dbo.RequestReview_dbo.CustomForm_ReviewFormId\". The conflict occurred in database \"Mkp\", table \"dbo.CustomForm\", column 'CustomFormId'.\r\nThe statement has been terminated.

我應該如何界定,使得鍵約束不強制關係?

我的代碼第一個模型定義這樣的領域:

[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; } 

回答

0

一個解決方案,我看到的是,你可以使用這個colunm ReviewFormId作爲implicite外鍵。我的意思是:不要將它定義爲外鍵,而只是定期的數據,而只有你會知道它裏面的數據表示外鍵,但不告訴實體它是外鍵,因爲GUID只是不接受可空的外鍵。

+0

我一直希望有更好的辦法。另外,如果我放棄ForeignKey屬性,遷移需要創建一個新的列'ReviewForm_CustomFormId',它具有相同的外鍵完整性。 –

+0

要明確,你可以有可空的外鍵。這是問題的GUID。 http://stackoverflow.com/questions/26000345/allow-null-foreign-key-guid –

+0

@SteveGreene你的實力,當然你可以有可空的外鍵,但這真的不符合使用實體框架,我'我已經經歷了這個問題百次,如果你找到了更好的方法來使GUID工作,請把鏈接放在這裏! –

0

給它一個單獨的主鍵字段,以及你的外鍵:

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

這樣做我可以插入具有空ReviewFormId記錄。

+0

對不起,我有一個主鍵,我只是沒有在示例中顯示它。我在上面的示例中添加了我使用的密鑰。這不是答案。 –