2014-01-30 6 views
9

habe ich eine Tabelle:mvc 5 Code erste Benutzer-ID als Fremdschlüssel

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

Ich möchte UserId Spalte ein Fremdschlüssel sein, Spalte Id des Mvc Mitgliedschaft des Nutzers. Wie kann ich das erreichen? Mein IdentityModels

:

public class ApplicationUser : IdentityUser 
{ 
} 

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

Antwort

19

Fügen Sie einen Verweis auf die ApplicationUser und geben Sie die 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; } 
} 

Fügen Sie das neue Modell Ihrem DbContext:

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

    /* rest of class */ 
} 

und Sie sollten Gut zu gehen (weniger Migrationen/Datenbankaktualisierungen).

+0

Dank geschrieben, dies funktioniert auch umgekehrt, wenn Sie die AspNetUsers Tabelle Verweis auf eine andere Tabelle mit einem Fremdschlüssel möchten, fügen Sie denselben Code in die ApplicationUser-Klasse ändern die relevanten Typen. Stellen Sie nur sicher, dass Sie eine Schlüsselspalte in der anderen Tabelle definieren. –

+0

@brad, wie Fremdschlüsselbeziehung hinzufügen, wenn meine Entitäten in einem anderen Klassenbibliotheksprojekt und Identitätstabellen in Webprojekt sind? Bitte lassen Sie mich wissen, wenn Sie eine Idee haben? – Steve

0

Ich mag nicht die Idee, [ForeignKey] Attribut in TestModel zu verwenden. Es ist besser, dies mit Fluent API zu tun. Hier ist der Code UserId Spalte in TestModel Tabelle hinzuzufügen und einen Fremdschlüssel hinzufügen:

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

Sie könnten in Fehler CS1061 laufen, wenn Gerüst Visual Studio 2015 verwenden, Ater im Anschluss an die große Antwort: /**** *********************/

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

Fügen Sie das neue Modell Ihrem DbContext:

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

    /* rest of class */ 
} 

/***** ********* ***************/ Lösung den Controller und Blick auf den betroffenen Controller löschen, Umbenennen in DbContext wie diese,

public class ApplicationDbContext : IdentityDbContext<Users> 

Neustart VS suchen dann Gerüst.

Haftungsausschluss: Bin nicht der Autor der obigen Lösung gerade bearbeitet und für jemanden‘Nutzen