8

Ici, nous sommes sur EF de base et a obtenu 3 tables:Comment relations avec les entités de configuration dans Entity Framework de base

  1. Nouvelles
  2. Articles
  3. Liens

Et plus (sauf Nouvelles, Articles): Contenu, poste, formulaire, etc

Et mes définitions de modèle

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
    public Link Link { get; set; } 
} 

public class News 
{ 
    public int Id { get; set; } 
    public string Header { get; set; } 
    public string Content { get; set; } 
    public Link Link { get; set; } 
} 

public class Link 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public int RowId { get; set; } 
    public string Url { get; set; } 
} 

Le tableau Links décrit l'URL pour chaque article et chaque article. Cela signifie que Links a 4 colonnes:

  1. Id
  2. Type - news ou article
  3. rowid - contient ID d'article ou Nouvelles (dépend du type)
  4. URL

Comment configurer les relations? Gardez à l'esprit que nous devons résoudre Entité par URL dans le tableau Liens.

+5

Veuillez utiliser un titre plus descriptif la prochaine fois et utiliser les balises appropriées. [tag: entity-framework] est pour l'ancien EntityFramework (1 à 6.x). [tag: entity-framework-core] est pour le nouveau, à partir de zéro EF Core réécrit et last but not least, avant de poser ce type de question, il est plus rapide et plus facile de consommer la documentation https://docs.microsoft.com/fr -us/ef/core/modeling/relations au lieu d'attendre une réponse;) – Tseng

+0

EF Core.Le principal problème qui est une base de données existante et indésirable pour modifier DB, parce que beaucoup de données et beaucoup d'entités avec ces liens (contenu, catalogue et plus) – Alex

+4

Qu'est-ce que vous décrivez est un modèle de base de données qui ne peut pas être décrit avec des contraintes FK, ne peut pas être mappé dans une version EF, y compris Core. –

Répondre

1

Dapper. Just Dapper qui permet d'écrire des requêtes personnalisées.

0

Mise à jour


Je lis votre question une fois de plus et bien pour être honnête, vous ne devez pas créer une autre table pour les liens, il suffit d'ajouter une colonne à Nouvelles et article et ainsi de suite .. et tout ira bien.

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
    public string Url { get; set; } 
} 

public class News 
{ 
    public int Id { get; set; } 
    public string Header { get; set; } 
    public string Content { get; set; } 
    public string Url { get; set; } 
} 
+0

Bonne idée Nouvelles et article. Mais ne modifiera pas la table des liens et ajoutera des colonnes, car à l'exception des nouvelles et des éléments il y a d'autres entités comme le contenu, etc. Donc ce sera beaucoup de NULL. C'est une raison pour laquelle voici RowId et Type. Puis-je utiliser quelque chose comme "HasDiscriminator" ou un autre truc? – Alex

+0

@Alex a mis à jour la réponse – Valkyrie

+0

comment construire sitemap alors? 'foreach' chaque table n'est pas une bonne idée. BTW, nous avons une table de menu qui décrit le menu de l'arbre. – Alex

0

Je changerais Link utiliser annulable int et séparer les clés étrangères pour ces tables:

public class Link 
{ 
    public int Id { get; set; } 
    public string Type { get; set; } 
    public int? NewsId { get; set; } 
    public int? ItemId { get; set; } 
    public string Url { get; set; } 
} 
+0

Non, car il y a beaucoup d'entités sauf les nouvelles et les éléments. – Alex

0

Je pense que vous pouvez supprimer le numéro de ligne de la table de liens et d'ajouter une clé étrangère colonne dans les deux autres tableaux référençant la colonne id dans la table des liens. Maintenant, avec vous ayant l'URL, vous avez le type et l'ID, vous pouvez simplement interroger le contenu de la table respective.

0

Afin d'avoir la NewRow de la propriété, et les contraintes aux deux autres tables, vous implémentez froid comme ceci:

public int RowId { 
    public get { 
     return this.Type.equals("news") ? NewsId.Value : ItemId.Value; 
    }; 
    private set { 
     if(this.Type.equals("news")){ 
      NewsId = value; 
     } 
     else{ 
      ItemId = value; 
     } 
    } 
} 

Et puis définissez la propriété comme non cartographié sur le ContextDB.