2014-01-29 56 views
0

嗨,我一直在四处搜寻,现在试图找出如何做到这一点,我没有任何运气。我正在用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时。

任何帮助将不胜感激。

+1

你是什么意思与 “*当我尝试更新此表*”? “更新”=更新此表中的记录(或甚至插入记录)?或者更新表模式(迁移?)?作为一个方面说明:我认为'ParentCommentId'应该可以为空('int?'),因为你肯定会有没有父母的评论,就像对线程的第一个评论。 – Slauma

+0

@Slauma对不起。具体而言,我正在讨论创建新评论并将其添加到数据库中。所以,插入一个新的行。是的,我同意你关于int ?. – rocktheartsm4l

回答

0

我同意@Slauma,您需要将ParentCommentId更改为int?类型。此外,如果你想使用ForeignKeyAttribute,你需要指定它来组合导航性能,象下面这样:

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); 
     } 
} 
+0

感谢您的快速回复。当我明天回到我的另一台计算机时,我会试试这个。我没有看到太多流畅的API,所以我在这里阅读,[链接](http://msdn.microsoft.com/en-us/data/jj591617.aspx)。我在想,如果你有什么时候使用流利的api和何时注释足够的建议? – rocktheartsm4l

+0

hi @ rocktheartsm4l,通过Fluent API,您也可以使用DataAnnotations配置所有内容。从配置选项和灵活性的角度来看,Fluent API是“更好的”。 – Lin

相关问题