ASP.NET MVC多对多关系,使用" My Own"表

时间:2015-04-23 18:37:41

标签: asp.net-mvc ef-code-first many-to-many entity-framework-6

我对使用Code First方法和实体框架相当新,我知道我有很多关系,比如下面的实体,EF会自动创建中间表:

class Post {
  ...
  public virtual ICollection<Category> Categories {get; set;}
  ... 
}

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

但是,如果在中间表中我需要额外的数据字段,一种可能的方式(我目前喜欢,也许是因为我不知道更好的方法)将定义我自己的新实体,如:

class Posts_Categories {
   public int Id {get; set;}
   public int CategoryId {get; set;}
   public int PostId {get; set;}
   public string Exrtafield1 {get; set;}
   public int ex extraField2 {get; set;}
   ...
   public virtual Post Post {get; set;}
   public virtual Category Category {get; set;}
}

使用这种方法,EF确实创建了我的自定义中间表,但它也创建了另一个自己的名为&#34; PostsCategories&#34;它只包含Post_Id的外键和Category_Id的另一个外键。

如何让它不创建额外的并使用我定义的那个? 这是使用额外数据字段管理多对多关系的好方法吗?

3 个答案:

答案 0 :(得分:5)

你应该使用这样的一对多关系:

public class Post
{
    public System.Int32 PostId { get; set; }

    [InverseProperty("Post")]
    public virtual ICollection<Posts_Category> PostCategories { get; set; }
}

public class Category
{
    public System.Int32 CategoryId { get; set; }

    [InverseProperty("Category")]
    public virtual ICollection<Posts_Category> PostCategories { get; set; }
}

public class Posts_Category
{
    public System.Int32 PostId { get; set; }

    public System.Int32 CategoryId { get; set; }

    [ForeignKey("PostId")]
    [InverseProperty("PostCategories")]
    public virtual Post Post { get; set; }

    [ForeignKey("CategoryId")]
    [InverseProperty("PostCategories")]
    public virtual Category Category { get; set; }
}

答案 1 :(得分:1)

我需要在 Iraj 的答案上进行一些扩展,以使其有效。另一个修改是我将默认ApplicationUser作为我的一个表格。

所以关系是ApplicationUser 1-∞IdeaVote∞-1 Idea(即有用户和想法,用户可以对想法进行投票,每个投票都用连接表示介于ApplicationUserIdea之间。

public class Idea
{
    [Key]
    public int Id { get; set; }

    // This is an ordinary data field
    public string Text { get; set; }

    [InverseProperty("Idea")]
    public virtual ICollection<IdeaVote> Votes { get; set; }
}

public class IdeaVote
{
    [Key]
    public int Id { get; set; }

    public int IdeaId { get; set; }
    [ForeignKey("IdeaId")]
    [InverseProperty("Votes")]
    public virtual Idea Idea { get; set; }

    public string UserId { get; set; }
    [ForeignKey("UserId")]
    [InverseProperty("Votes")]
    public virtual ApplicationUser User { get; set; }
}
public class ApplicationUser : IdentityUser
{
    [InverseProperty("User")]
    public virtual ICollection<IdeaVote> Votes { get; set; }

    // Default stuff
}

答案 2 :(得分:0)

为两者之间的关系创建PostsCategories表是正常的,你会想要这样。如果c是类别,您将能够执行c.Posts

之类的操作

通常你不会为此手动创建自己的表。您将在“额外”字段中保留哪些类型的数据?我可能会将字段移动到其他表之一并删除该字段。大多数关系表不包含额外的字段。