2014-01-30 55 views
9

我有一個表:MVC 5碼第一用戶ID作爲外鍵

public class TestModel 
{ 
    public int Id { get; set; } 
    public string UserId { get; set; } 
    public string Name { get; set; } 
} 

我想用戶ID列是一個外鍵的MVC成員的用戶ID列。 我該如何實現這一目標?

我IdentityModels:

public class ApplicationUser : IdentityUser 
{ 
} 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection") 
    { 
    } 
} 

回答

19

添加一個參考ApplicationUser並指定ForeignKey的:

public class TestModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public string UserId { get; set; } 
    [ForeignKey("UserId")] 
    public ApplicationUser User { get; set; } 
} 

新模式添加到您的DbContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<TestModel> TestModels { get; set; } 

    /* rest of class */ 
} 

,你應該做得很好(更少的遷移/數據庫更新)。

+0

感謝作者,這也適用於相反的,如果你想與外鍵的AspNetUsers表引用另一個表,添加相同的代碼到ApplicationUser類更改相關類型。只要確保在另一個表中定義了一個關鍵列。 –

+0

@brad如果我的實體在另一個類庫項目中並且身份表位於Web項目中,如何添加外鍵關係?如果您有任何想法,請讓我知道嗎? – Steve

0

我不喜歡在TestModel中使用[ForeignKey]屬性的想法。使用Fluent API來做到這一點更好。下面是代碼在TestModel表中添加UserId列,並添加一個外鍵約束:

public class TestModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ApplicationUser ApplicationUser { get; set; } 
} 

public class ApplicationUser : IdentityUser 
{ 
    public virtual TestModel TestModel { get; set; } 
} 

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() : base("DefaultConnection") 
    { 
    } 

    public DbSet<TestModel> TestModels { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<ApplicationUser>() 
      .HasOptional(m => m.TestModel) 
      .WithRequired(m => m.ApplicationUser) 
      .Map(p => p.MapKey("UserId")); 
    } 
} 
-1

使用Visual Studio 2015年時,支架,您可能會遇到錯誤CS1061,亞特偉大的答案如下: /**** *********************/

public class TestModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public string UserId { get; set; } 
    [ForeignKey("UserId")] 
    public ApplicationUser User { get; set; } 
} 

新模式添加到您的DbContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public DbSet<TestModel> TestModels { get; set; } 

    /* rest of class */ 
} 

/***** ********* ***************/ 解決方案 刪除控制器和視圖受影響的控制器, 重命名到的DbContext 看起來像這樣

public class ApplicationDbContext : IdentityDbContext<Users> 

重啓VS,然後腳手架。

免責聲明:我不是上述方案只是編輯和發佈的人的利益