2017-05-03 127 views
1

注意:對於這個問題,我簡化了一下模型。實體框架不生成ApplicationUser外鍵

我正在使用ASP.NET Core MVC應用程序(使用Entity Framework Core)。我有三個模型。我有一個ApplicationUser(從IdentityUser擴展而來),我有一個Activity模型,我有一個'SignUp'模型,它具有一個活動的外鍵和一個ApplicationUser的外鍵。至少,這是主意。事情是,實體框架將FK作爲活動FK,但不是應用程序用戶。這只是數據庫中的另一個int,沒有任何FK約束。

我嘗試了很多我在互聯網上找到的東西,但是我無法得到它的工作。這是我目前有(簡稱爲清楚起見):

活動:

public class Activity 
{ 
    public Activity() 
    { 
     SignUps = new HashSet<SignUp>(); 
    } 

    public int ActivityID { get; set; } 

    [Required] 
    [StringLength(50)] 
    [Display(Name = "Naam")] 
    public string Name { get; set; } 

    public virtual ICollection<SignUp> SignUps { get; set; } 
} 

ApplicationUser:

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 

     Activities = new HashSet<Activity>(); 
    } 

    [Required] 
    [Display(Name = "Voornaam")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "Achternaam")] 
    public string LastName { get; set; } 

    public virtual ICollection<Activity> Activities { get; set; } 
} 

註冊:

public class SignUp 
{ 
    public int SignUpID { get; set; } 

    [Required] 
    public int ActivityID { get; set; } 

    [ForeignKey("ApplicationUser")] 
    public int ApplicationUserID { get; set; } 

    [Required] 
    public string Status { get; set; } 
} 

注:我第一次沒有[ForeignKey]屬性(就像活動一樣),但它在那裏,因爲我試圖讓它工作。

正如我上面所說的,SignUp中的Activity FK工作正常,Applicationuser FK沒有。實體框架只是在數據庫中生成一個沒有任何FK限制的int,並且在腳手架CRUD頁面時,它也不會被識別爲FK。

我對ASP.net MVC和EF相當陌生,我感覺我忽略了一些非常簡單的東西。 Facepalm時刻來臨?

謝謝!

回答

2

Activity關係可以工作,因爲您在那裏涉及導航屬性。 Activity具有ICollection<SignUp>,因此EF在SignUp上綁定到ActivityID以維護該集合。與ApplicationUser沒有任何相似之處。你只需要一個名爲ApplicationUserID的房產; EF不會做任何事情,因爲它不知道應該

只需添加一個導航屬性,你會好:

[ForeignKey("ApplicationUser")] 
public int ApplicationUserID { get; set; } 
public ApplicationUser ApplicationUser { get; set; } 

編輯

其實,在你的代碼看多一點之後,我想你可能只是搞砸了ApplicationUser上的ICollection<Activity>ApplicationUserActivity之間沒有直接關係。這種關係來自SignUp,這基本上是一個有效載荷的M2M。因此,你應該有以下代替:

public class ApplicationUser : IdentityUser 
{ 
    public ApplicationUser() 
    { 

     Activities = new HashSet<Activity>(); 
    } 

    [Required] 
    [Display(Name = "Voornaam")] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "Achternaam")] 
    public string LastName { get; set; } 

    public virtual ICollection<SignUp> SignUps { get; set; } 
} 

然後,它會成爲您Activity關係目前不完全一樣的。

+0

哦,上帝,這是我已經期待的facepalm時刻......我忽略了大概幾個小時內的Acitivity而不是SignUp。好的,如果你看的時間太長,你有時會開始懷念。謝了哥們!我感謝您的幫助 :) – Landcross