EF 7 beta 6: Entités ayant une ou plusieurs relations dans EF 7

c# entity-framework entity-framework-core

Question

J'ai un modèle très simple:

class Bag
{
    public int Id { get; set; }
    public ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }
}

La fonction OnModelCreating mon contexte (dans EF 6 ) ressemble à quelque chose comme:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Bag>()
        .ToTable("Bag")
        .HasMany(x => x.RandomThings).WithRequired(x => x.Bag).WillCascadeOnDelete();

    modelBuilder.Entity<RandomThing>().ToTable("RandomThing");
}

Autant que je sache, il n'y a pas de moyen équivalent de le faire. Je sais que les suppressions en cascade ne sont pas prises en charge . Cependant, je me demandais quelle est la meilleure façon de modéliser les relations un à plusieurs telles que définies dans mon exemple de code? Il semble que tout cela a disparu (ou doit encore être mis en œuvre).

J'ai vu un exemple ( ici ) d'un DbContext exactement comme je le veux, mais il est faux et ne fonctionne pas. Si j'essaie d'extraire ce code source, de configurer mon environnement et de sauvegarder sur une entité de blog avec des publications, ces publications ne sont pas enregistrées comme on pourrait l'imaginer.

Y at-il des solutions de contournement pour cela?

Réponse acceptée

Mise à jour : Cette réponse a été écrite pour EF7 beta7. Les API ont depuis changé. Voir http://docs.efproject.net/en/latest/modeling/relationships.html pour connaître les dernières informations relatives à l'utilisation d'EF Core.

Réponse originale

Dans EF 7, vous pouvez configurer une à plusieurs relations dans la méthode OnModelCreating. Pour que cela fonctionne, ajoutez une propriété à RandomThing pour représenter la clé Forign, ainsi qu'une référence CLR au type parent.

class Bag
{
    public int Id { get; set; }
    public ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }

    public Bag Bag { get; set; }
    public int BagId { get; set; }
}

Dans votre contexte, configurez la relation avec la configuration suivante:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{  
    modelBuilder.Entity<RandomThing>()
        .Reference(e => e.Bag)
        .InverseCollection(p => p.RandomThings)
        .ForeignKey(e => e.BagId);
}

Remarque secondaire : lorsque EF 7 envisage d’ajouter un support pour la configuration via des attributs.


Réponse populaire

Bien que je n'aie pas du tout utilisé EF7, dans EF6, vos modèles ressembleraient à ceci:

class Bag
{
    public int Id { get; set; }
    public virtual ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }

    public int BagId {get; set;}
    [ForeignKey("BagId")]
    Public Bag Bag {get; set;}
}

Ainsi, la relation est gérée avec des annotations de données et vous n'avez pas besoin du model builder pour cette tâche spécifique.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi