Question

Je m'amuse avec LinqToSQL en utilisant une base de données multilingue existante, mais je rencontre des problèmes pour mapper une relation un à un assez importante. Je suppose donc que je n'utilise pas cette fonctionnalité correctement pour la conception de ma base de données.

Supposons deux tables, Category et CategoryDetail. Category contient les informations CategoryId (PK), ParentId et TemplateId. CategoryDetail contient le CategoryId (FK), le LanguageId, le titre et la description (dans la langue appropriée), avec une clé de protection combinée de CategoryId et de LanguageId.

Si je glisse-déplace ces tables dans le concepteur LinqToSQL, le modèle d'objet résultant contient Category avec une collection d'objets CategoryDetail, ce qui ne devrait jamais être le cas. J'aimerais pouvoir filtrer LanguageId au niveau de DataContext, ce qui signifie que toute la catégorie est encapsulée dans Category.CategoryDetail, mais pas toutes les versions linguistiques encapsulées dans Category.CategoryDetails.

Cette base de données a bien fonctionné sur mon ancienne bibliothèque d'objets (BOL et DAL de la vieille école), mais je crains que LinqToSQL n’exige de la modifier pour pouvoir obtenir le résultat souhaité.

Quel est le meilleur moyen de rendre cette relation (et le filtrage linguistique) aussi transparente que possible?

Était-ce utile?

La solution

Vous pouvez afficher les propriétés de l'association. (Cliquez avec le bouton droit sur la ligne représentant l'association et affichez les propriétés.) Les propriétés vous indiqueront s'il s'agit d'une relation un à un ou un à plusieurs. Cela se traduit dans le code par une association à entité unique (un à un) ou un ensemble d’entités (un à plusieurs).

Autres conseils

Je dois supposer que je ne peux pas être un vrai 1 sur 1. On dirait que vous avez un PK de CatID et Lang ID sur la table Cat Details. Cela expliquerait pourquoi il met une collection. Je peux me tromper car vous n'avez pas mentionné les PK de la table CatDetails

EDIT: Un Pk combiné de CatID et Lang ID donne une relation 1: m, et Linq to SQL fait ce qu’il faut. La seule façon de créer un vrai 1: 1 est si vous avez également un ID de langue sur la table des chats et que cela fait partie du FK. Je pense que vous devrez peut-être repenser ce que vous voulez faire ou comment vous voulez le mettre en œuvre.

Je pense que LINQ to SQL modélise directement la structure de la base de données. Vous avez deux tables donc il crée 2 objets.

Avez-vous examiné LINQ to Entities? Cela vous permet de créer un autre calque au-dessus de la structure de la base de données pour créer des classes plus lisibles.

Comme vous n’avez pas de relation 1: 1, le mappage ne fournira pas à lui seul les fonctionnalités souhaitées. Cependant, il est facile de fournir une méthode dans la classe parent générée automatiquement qui effectue le travail:

public partial class Category 
{
  public IEnumerable<CategoryDetail> GetDetailsByLanguage(string langID)
  {
    return this.CategoryDetails.Where(c => c.LangID == langID);
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top