2016-10-10 2 views
0

Je veux générer une table de jonction entre l'utilisateur et la publication et je veux avoir l'ID utilisateur dans la table de la poste.Beaucoup à beaucoup avec clé étrangère supplémentaire?

J'ai ce code

public class Post 
{ 
    public Post() 
    { 
     this.ApplicationUser = new HashSet<ApplicationUser>(); 
    } 

    public int PostId { get; set; } 
    public string Message { get; set; } 
    public DateTime MessageDate { get; set; } 

    public virtual ApplicationUser User { get; set; } //this is the problem 

    public virtual ICollection<ApplicationUser> ApplicationUser { get; set; } 
} 

public class ApplicationUser : IdentityUser 
{ 
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     // Add custom user claims here 
     return userIdentity; 
    } 

    public ApplicationUser() 
    { 
     this.Posts = new HashSet<Post>(); 
    } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

Je reçois la table de jonction supplémentaire et beaucoup à plusieurs rapports entre l'utilisateur et après. Mais c'est faux.

public virtual ApplicationUser User { get; set; } 

Ceci génère deux UserId dans le tableau de poste (applicationUser_id et User_id) et Post_PostId dans le tableau de l'utilisateur. Je veux juste un champ supplémentaire dans la table Post, FK UserId.

Je veux trois tableaux comme celui-ci

Poster

postID message Date de UserId FK

utilisateur

UserId et e e reste des champs utilisateur d'identité asp.net

UserPosts

UserId postID

+0

vérifier mon code mis à jour –

Répondre

0

table utilisateur

public partial class User 
{ 

public User() 
{ 
    this.Posts = new HashSet<Post>(); 
    this.UserPosts = new HashSet<UserPost>(); 
} 

public int UserId { get; set; } 
public string Username { get; set; } 

public virtual ICollection<Post> Posts { get; set; } 

public virtual ICollection<UserPost> UserPosts { get; set; } 
} 

Table Poster

public partial class Post 
{ 
public Post() 
{ 
    this.UserPosts = new HashSet<UserPost>(); 
} 

public int PostId { get; set; } 
public string Message { get; set; } 
public Nullable<System.DateTime> Date { get; set; } 
public Nullable<int> UserId { get; set; } 

public virtual User User { get; set; } 

public virtual ICollection<UserPost> UserPosts { get; set; } 
} 

et votre table de correspondance, comme celui-ci votre colonne 1) Id (pk), 2) UserId (fk) 3) postID (fk)

en utilisant le tableau cadre de l'entité ont une clé primaire nécessaire.

table UserPost

public partial class UserPost 
{ 
public int Id { get; set; } 
public Nullable<int> UserId { get; set; } 
public Nullable<int> PostId { get; set; } 

public virtual Post Post { get; set; } 
public virtual User User { get; set; } 
} 

Code Mise à jour

modelBuilder.Entity<Post>().ToTable("userid table name"); 

cette ligne ajouter ci-dessous la méthode de cette classe ApplicationDbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 


} 
+0

Avez-vous explicitement besoin de configurer UserPost utilisateur pour obtenir une clé étrangère dans les messages? Si vous regardez att mon code, il génère une table userPost et une relation many-to-many et fonctionne très bien. Le problème consiste à ajouter une clé FK à l'utilisateur d'identité asp.net dans la table des postes. Vous pouvez voir que vous utilisez le code similaire "utilisateur virtuel public utilisateur {get; set;}" dans la classe de publication, mais cela ne fonctionne pas pour moi. – Xtreme

+0

mon code ne fonctionne pas? –

+0

Votre code fonctionne mais ce n'est pas exactement ce que je cherche. Vous créez un nouvel utilisateur de classe, mais je veux utiliser Applicationuser. Une table utilisateur (AspNetUser) est automatiquement créée lorsque vous créez un nouveau projet avec l'identité asp.net, je veux utiliser cette table déjà générée. Voir mon premier message. Le problème est d'obtenir cet UserId dans la table de poste. Quelque chose comme la chaîne publique Id {get; ensemble; } ne fonctionne pas. – Xtreme