2014-01-29 1 views
0

Привет, я искал около 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.

Любая помощь была бы принята с благодарностью.

+1

Что вы имеете в виду "*, когда я пытаюсь обновить эту таблицу *"? «Обновить» = обновить запись в этой таблице (или даже вставить запись)? Или обновить схему таблицы (миграция?)? В качестве побочного примечания: я думаю, что 'ParentCommentId' должен быть нулевым (' int? '), Потому что у вас наверняка будут комментарии без родителя, например, самый первый комментарий к потоку. – Slauma

+0

@Slauma Извините за неопределенность. В частности, я говорил о создании нового комментария и добавлении его в базу данных. Итак, вставка новой строки. И да, я согласен с тобой по поводу инт. – rocktheartsm4l

ответ

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

Спасибо за быстрый ответ. Я попробую это, когда вернусь на другой компьютер завтра. Я не видел много свободного API, поэтому я читал здесь, [link] (http://msdn.microsoft.com/en-us/data/jj591617.aspx). Мне было интересно, если бы у вас были какие-либо советы о том, когда следует использовать свободную api и когда комментариев достаточно? – rocktheartsm4l

+0

hi @ rocktheartsm4l, все, что вы можете настроить с помощью DataAnnotations, также возможно с Fluent API. С точки зрения параметров конфигурации и гибкости Fluent API «лучше». – Lin