2016-07-31 51 views
1

喜欢的用户文章中,我有博客帖子三个表:如何创建一个表中的实体框架

  • Post表像PostIDTitle岗位性质等
  • User表作者性质如UserID等。
  • PostLike表包括两列,如PostIDUserID,它们是外键列。此表存储用户喜欢的帖子。事实上,当一个用户喜欢一个帖子时,一个记录被插入到这张表中。

我的代码是:

public partial class Post 
     { 
     public Post() 
      { 
      } 
     public int PostID { get; set; } 
     [Required, StringLength(150)] 
     public string Title { get; set; } 
     public int UserID { get; set; } 
     public virtual User User { get; set; } 
     } 

    public partial class User 
     { 
     public User() 
      { 
       Posts = new HashSet<Post>(); 
      } 
     public int UserID { get; set; } 
     [Required,StringLength(50)] 
     public string Name{ get; set; } 

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

    public partial class PostLike 
    { 
     public PostLike() 
      { 
      Posts = new HashSet<Post>(); 
      Users = new HashSet<User>(); 
      } 

     [Key,Column(Order = 0),ForeignKey("Posts")] 
     public int PostID { get; set; } 
     [Key, Column(Order = 1),ForeignKey("Users")] 
     public int UserID { get; set; } 

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

    } 

但是,当数据库被创建,PostLike表没有任何外键和User表有两个外键,如PostLike_PostIDPostLike_UserID。有必要指出Post表没有那些外键。 可以帮我吗?

回答

0

PostLike记录中的每个记录将只有一个帖子和一个用户。所以你不需要收集类型。

public class PostLike 
{ 
    public int Id { set; get; } 
    public int PostID { get; set; } 
    public int UserID { get; set; } 

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

现在要防止“可能导致周期或多个级联路径”错误,您只需要禁用级联删除。您可以在数据上下文类的OnModelCreating方法中执行此操作。

public class YourDataContex : DbContext() 
{  
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<PostLike>() 
     .HasRequired(c => c.User) 
     .WithMany() 
     .WillCascadeOnDelete(false); 
    } 
    public DbSet<User> Users { set; get; } 
    public DbSet<Post> Posts { set; get; } 
    public DbSet<PostLike> PostLikes { set; get; } 
} 

这将创建3列IdPostID(FK)和UserID(FK)

+0

感谢PostLikes表这么多,它的工作。是否需要“Id”列?是否有可能将其删除? – msitworld

+0

如果我们将'[Key,Column(Order = 1)]'和'[Key,Column(Order = 2)]'属性添加到'PostID'和'UserID',可以删除'Id'列。 – msitworld

+0

@msitworld不知道它是否发生了变化,但是一般意见(主要由知名EF专家Julie Lerman表示)是应该避免加入除外键之外没有列的表。她建议始终包括ID列,因为EF可能会有其他问题。 –