1

Je migre mon application php vers une application de base .net en utilisant Entity Framework Core.Modèles traduisibles avec Entity Framework Core

Plusieurs de mes modèles ont des traductions qui leur sont liées à partir de la table translations. La façon dont les modèles sont liés aux traductions est par modelname et modelid. Le modelname est le nom de la classe et l'identifiant est l'identifiant de cet objet. Gardez à l'esprit qu'un objet peut avoir plusieurs traductions avec un slug unique.
Je me demandais s'il était possible d'implémenter facilement cette structure d'entité en utilisant. Ainsi, les modèles sont liés par leur identifiant, mais également filtrés sur leur propre nom de classe. Devrai-je créer cette relation dans une API fluide pour chaque modèle ou existe-t-il une meilleure solution pour cela?

Voici un petit exemple de l'aspect de la base de données. Mais dans la vraie base de données, il y a beaucoup plus de tables qui ont des traductions. La base de données peut, bien sûr, être modifiée si nécessaire.

enter image description here

Répondre

-1

La solution que je l'habitude de résoudre ce problème est l'ajout d'une nouvelle table, Translatables. chaque table qui est traduisible a maintenant un champ translatable_id et toutes les traductions sont liées à un Translatable.

0

Il semble que vous voulez réaliser association polymorphique avec la stratégie de PTC.

Malheureusement version actuelle EF Core 2.0 ne prend pas en charge TPC et fonctionnalité est prévue pour la libération dans EF base de 2,1 à https://github.com/aspnet/EntityFrameworkCore/wiki/Roadmap

Ceci est la solution qui fonctionne avec EF 6.0:

public class Context : DbContext 
{ 

    public Context() : base() 
    { 

    } 

    public IDbSet<Translation> Translations { get; set; } 

    public IDbSet<TranslatedModel> TranslationModels { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Store>().Map(m => 
      { 
       m.MapInheritedProperties(); 
       m.ToTable("Stores"); 
      }); 

     modelBuilder.Entity<Publisher>().Map(m => 
      { 
       m.MapInheritedProperties(); 
       m.ToTable("Publishers"); 
      }); 

     modelBuilder.Entity<Translation>() 
      .HasRequired(t => t.TranslatedModel) 
      .WithRequiredDependent(t => t.Translation); 
    } 
} 

public class Translation 
{ 
    public int Id { get; set; } 

    public string Value { get; set; } 

    public TranslatedModel TranslatedModel { get; set; } 
} 

public abstract class TranslatedModel 
{ 
    public int Id { get; set; } 

    public Translation Translation { get; set; } 
} 

public class Store : TranslatedModel 
{ 
    public int Website { get; set; } 

} 

public class Publisher : TranslatedModel 
{ 
    public string Website { get; set; } 
} 

problème ici est que vous pouvez avoir les mêmes identifiants pour les produits et les magasins, ce qui entraîne des conflits. Donc, je recommanderais au lieu d'avoir model_id et model_name comme clé de référence, il suffit de changer votre type d'id de GUID et laisser tomber le model_name.

plus d'info ici:

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

0

Ce que je sais que EF ne offre qui pourrait aider est que EF offre polymorphisme basé sur de conditions. Vous pouvez implémenter une classe Model en utilisant "Translations" comme base de table, avoir des produits/magasins/éditeurs hérités de Model, et définir la condition d'instanciation d'un produit/magasin/éditeur à partir du champ "model_name".

Je ne suis pas tout à fait sûr, mais dans les classes enfant, vous pouvez être en mesure de définir ces propriétés de navigateur comme pertinentes uniquement pour un type.

Voici le guide:

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

+0

Le problème est qu'il fait référence à EF Core et ce type d'héritage n'est pas supporté jusqu'à présent. –