表与同一实体类型的外键

时间:2014-01-29 19:51:29

标签: asp.net asp.net-mvc entity-framework-6

嗨,我一直在寻找40分钟,现在试图弄清楚如何做到这一点,我没有运气。我正在用ASP.NET创建一个论坛应用程序。 MVC5和EF6。我的应用包含评论模型;这是我开始遇到问题的地方。我希望线程能够发表评论(这很容易),我也希望评论有评论(这是我的问题)。

以下是我的模型定义方式:

    namespace Forum.Models
    {
        public class Comment
        {
            [Key]
            public int Id {get; set;}
            [DisplayFormat(DataFormatString = "{0:d/M/yyyy HH:mm:ss}",         
             ApplyFormatInEditMode = true)]
            public DateTime TimeStamp { get; set; }

            public string Content { get; set; }

            public String UserId { get; set; }

            public virtual ICollection<Comment> Comments { get; set; }

            [ForeignKey("ParentComment")]
            public int ParentCommentId { get; set; }
            public virtual Comment ParentComment { get; set; }

            public int ThreadId { get; set; }
            public virtual Thread Thread {get; set;}
         }
     }

这是我尝试更新此表时遇到的错误:

  

当IDENTITY_INSERT设置为OFF时,无法在表'Comments'中为identity列插入显式值。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我同意@Slauma,您需要将ParentCommentId更改为int?类型。此外,如果要使用ForeignKeyAttribute,则需要将其分配给navagation属性,如下所示:

public int? ParentCommentId { get; set; }

[ForeignKey("ParentCommentId")]
public virtual Comment ParentComment { get; set; }

以下是一个示例,我使用流畅的API来配置关系。

Coment模特课:

public class Comment
{
    [Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [DisplayFormat(DataFormatString = "{0:d/M/yyyy HH:mm:ss}",ApplyFormatInEditMode = true)]
    public DateTime TimeStamp { get; set; }

    public string Content { get; set; }

    public String UserId { get; set; }

    public virtual ICollection<Comment> Comments { get; set; }

    public int? ParentCommentId { get; set; }

    public virtual Comment ParentComment { get; set; }

    public int ThreadId { get; set; }
    public virtual Thread Thread { get; set; }
}

DbContext上课:

public class YourDbContext : DbContext
{
     public DbSet<Comment> Comments { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
      {
        modelBuilder.Entity<Comment>()
           .HasOptional(c => c.ParentComment )
           .WithMany(c => c.Comments)
           .HasForeignKey(c => c.ParentCommentId );
      }
}