多对多有额外的外键?

Posted

技术标签:

【中文标题】多对多有额外的外键?【英文标题】:Many to many with extra foreign key? 【发布时间】:2016-10-10 17:46:37 【问题描述】:

我想在 user 和 post 之间生成一个联结表,并且我希望在 post 表中包含 userId。

我有这个代码

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; 

我得到了额外的联结表以及用户和帖子之间的多对多关系。但这是错误的。

   public virtual ApplicationUser User  get; set; 

这会在 post 表中生成两个 UserId(applicationUser_id 和 User_id),在 User 表中生成 Post_PostId。我只想要 Post 表中的一个额外字段 FK UserId。

我想要三个这样的表

发帖

PostId 信息 日期 UserId FK

用户

用户 ID 以及 asp.net 身份用户中的其余字段

用户帖子

用户 ID 邮政编号

【问题讨论】:

检查我更新的代码 【参考方案1】:

用户表

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; 

发布表格

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; 

还有你的映射表,像这样 你的列 1) Id (pk), 2) UserId (fk) 3) PostId (fk)

使用实体框架表需要一个主键。

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; 

更新代码

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

这一行添加到这个类的下面方法ApplicationDbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)




【讨论】:

是否必须明确设置用户 UserPost 才能在帖子中获取外键?如果您查看我的代码,它会生成一个 userPost 表和多对多关系,并且工作正常。问题是在 post 表中向 asp.net 身份用户添加 FK 密钥。可以看到您在 post 类中使用了类似的代码“public virtual User User get; set; ”,但它对我不起作用。 您的代码有效,但它不是我正在寻找的。您创建了一个新类用户,但我想使用 Applicationuser。当您使用 asp.net Identity 创建一个新项目时,会自动创建一个用户表 (AspNetUser),我想使用该已生成的表。见我的第一篇文章。问题是在 post 表中获取该 UserId。像 public string Id get;放; 不起作用。 是的,我明白了。让我试试你的要求。

以上是关于多对多有额外的外键?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.3,MySQL,迁移中正确的外键设置(一对多,多对多)

没有连接表的多对多映射

Django 之 ORM表之间的外键关联与多对多

Jpa之关联对象(单向多对多)

JPA多对多

数据库设计中一对多对多对多关系依据外键的实现条件及方法