0

J'ai l'entité suivante:Selft tableau faisant référence à EntityFramework (Insérer erreur)

public class Category 
{ 
    public virtual long Id { get; set; } 
    public string Name { get; set; } 
    public virtual long ParentId { get; set; } 
    public virtual Category Parent { get; set; } 
    public virtual List<Category> Categories { get; set; } 
} 

public class CategoryConfiguration: 
    EntityTypeConfiguration<Category> 
{ 
    public CategoryConfiguration() 
    { 
     this.HasKey(entity => entity.Id); 
     this.Property(entity => entity.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

     this.HasRequired(entity => entity.Parent).WithMany(entity => entity.Categories).HasForeignKey(entity => entity.ParentId); 
     this.HasMany(entity => entity.Categories).WithRequired(entity => entity.Parent).HasForeignKey(entity => entity.ParentId); 

     this.Property(entity => entity.Name).IsRequired().HasMaxLength(1000); 
    } 
} 

EF est en mesure de créer le schéma très bien mais a des problèmes lors de l'insertion des données avec le code suivant:

var category = new Category(); 
category.Name = "1"; 
category.Description = "1"; 
category.Parent = category; 

using (var context = new Context()) 
{ 
    context.Categories.Add(category); 

    context.SaveChanges(); 
} 

erreur: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

Je suppose que cela est dû au champ ParentId étant non-nullable (ce qui est le intentio n). Sans l'utilisation d'un ORM, normalement:

  • Définissez le type de colonne sur nullable.
  • Créez une catégorie principale pour générer automatiquement la clé primaire.
  • Définissez ParentId sur la clé primaire nouvellement générée.
  • Définissez à nouveau le type de colonne non-nullable.

Comment pourrais-je réaliser cela avec EntityFramework?

+0

Je ne pense pas que vous pouvez insérer une ligne dans la table SQL qui se réfère à elle-même et la référence est non nulle et c'est le problème principal ici. –

Répondre

0
public class Category 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 


    public long? ParentID { get; set; } 
    public Category Parent { get; set; } 
} 


modelBuilder.Entity<Category>(). 
     HasOptional(c => c.Parent). 
     WithMany(). 
     HasForeignKey(m => m.ManagerID); 

Salut, je ne peux pas essayer ce code maintenant, mais je pense que cela va fonctionner :)

Here est par exemple avec votre table.

+1

Il souhaite spécifiquement que ParentId soit non nul. –

+0

@JanneMatikainen vous avez raison. – Mariusz

Questions connexes