2016-02-01 65 views
0

我真的不明白這個EF核心1.0的錯誤?EF核心1.0外鍵問題

public class User : BaseEntity 
{ 
    public string Username { get; set; } 
} 
public class UserDetail : BaseEntity 
{ 
    public int UserId { get; set; } 
    public string Address { get; set; } 
    public string Country { get; set; } 

    public virtual User User { get; set; } 

    [ForeignKey("UserId")] 
    public virtual ICollection<UserLanguage> Languages { get; set; } 
} 

public class UserLanguage : BaseEntity 
{ 
    public string Name { get; set; } 
    public int UserId { get; set; } 
} 

在我的用戶表我有3個用戶

Id   Username 
----------- --------------- 

1   john 
2   doe 
3   jack 

在我UserDetail我有2個記錄

Id   UserId  Address           Country 
----------- ----------- -------------------------------------------------- ------ 
1   1   Some Address          MY 
2   3   NULL            SG 

在我的用戶語言,當執行插入

INSERT INTO UserLanguage(Name, UserId) 
VALUES ('English', 3) 

它會遇到下面的錯誤

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserLanguage_UserDetail_UserId". The conflict occurred in database "Job", table "dbo.UserDetail", column 'Id'. 

我在這裏做錯了什麼? ForeignKey的是userid的方式來將其指向UserDetail列「ID」

+0

您是否真的在執行您提供的SQL語句(例如使用ExecuteSqlCommand)還是僅僅是您的EF代碼的粗略翻譯?這不太可能是EF中的一種錯誤,但是如果您正在執行SQL,則可能會發現標籤「T-SQL」和「SQL」的運氣更好 - 這聽起來更像是表配置問題而不是代碼問題。 – nemec

+0

基本上我會使用entityframework insertasync執行插入操作,然後我得到那個錯誤。然後我編寫SQL語句並在sql ide中執行它也返回相同的錯誤消息。 – tomato45un

回答

2

嘗試以下

public class User : BaseEntity 
{ 
    public string Username { get; set; } 

    public virtual ICollection<UserLanguage> Languages { get; set; } 
} 
public class UserDetail : BaseEntity 
{ 
    public int UserId { get; set; } 
    public string Address { get; set; } 
    public string Country { get; set; } 

    public virtual User User { get; set; }   
} 

public class UserLanguage : BaseEntity 
{ 
    public string Name { get; set; } 
    public int UserId { get; set; } 

    public virtual User User { get; set; } 
} 

這個問題在下面一行代碼

[ForeignKey("UserId")] 
public virtual ICollection<UserLanguage> Languages { get; set; } 

這創建了UserDetail之間的外鍵關係和UserLanguage表,而您想在User和UserLanguage表之間創建它。

在你現有的模式,如果你嘗試插入

INSERT INTO UserLanguage(Name, UserId) 
VALUES ('English', 1) 
INSERT INTO UserLanguage(Name, UserId) 
VALUES ('French', 2) 

它會成功,因爲UserDetail有兩個條目1,2 PK而存在UserDetail與PK 3沒有進入。

0

要將UserLanguage類嘗試添加:

public virtual UserDetail UserDetail { get; set; } 
+0

嘗試它不工作,奇怪的問題。 – tomato45un