2009-01-24 7 views
10

Je suis un développeur Rails un peu expérimenté et je pensais essayer la version de ASP.NET de MVC. Ce faisant, j'ai également décidé d'essayer Linq-> Sql ...Linq To Sql Beaucoup-Beaucoup Join Table

Je suis un peu confus sur la façon dont Linq-> Sql gère les jointures.

Un exemple trivial de mon schéma est:

livres:
id
titre

catégories:
id
Nom

books_categories:
book_id
category_id

faisant glisser simplement ces tables dans le fichier .dbml ne semble pas le faire. Je reçois une propriété sur ma classe Book books_categories, ce que j'attends d'une propriété que je peux itérer et obtenir des classes Category directement.

En ce moment, je dois faire quelque chose qui se sent très mal

 foreach (books_categories bc in book.books_categories) 
     { 
      category_names.Add(bc.Category.category.Trim()); 
     } 

[En réponse à la réponse acceptée]
j'accepté à contrecœur la réponse de « écrire votre propre code de colle ». Après avoir continué mes recherches sur Linq-> Sql, j'ai découvert qu'il semble être lentement abandonné en faveur de l'Entity Framework (plus puissant, IMO). EF permet toujours d'utiliser LINQ pour les requêtes et fait un travail décent pour trouver des relations comme Ruby's ActiveRecord.

Répondre

8

Utilisez une implémentation de la classe partielle pour livre et ajouter des méthodes appropriées pour les catégories et leurs propriétés. Avoir les propriétés frontales la propriété Books_Categories (vous pouvez avoir cette visibilité privée pour forcer l'implémentation à travers votre propriété Categories). De toute évidence, vous aurez besoin d'ajouter une vérification des erreurs/limites, etc., mais vous en aurez l'idée.

Je vais vous accorder ceci n'est pas idéal, mais au moins vous avez la possibilité de déterminer comment cela fonctionne.

+0

wouldn » t vous seulement être en mesure d'ajouter une Book_Category, à this.Book_Categories dans vos méthodes d'ajout et de suppression? –

+0

Modifier l'erreur - J'ai probablement tapé le code, puis renommé la propriété. Mettra à jour. – tvanfosson

0

Je ne pense pas que votre résultat attendu soit pris en charge dans Linq to Sql. Ce que vous faites peut vous donner tort, mais je pense que c'est une façon de contourner cette limitation de L2S.

Man, je dois vraiment entrer dans Rails ...

2

De nombreux mappages sont explicitement pris en charge dans Entity Framework, mais pas dans LINQ to SQL. Vous pouvez également utiliser des ORM tiers tels que NHibernate.

+0

Cela me fait me demander pourquoi j'utiliserais Linq-> Sql sur Ado.NET + Linq. Je pensais que Linq-> Sql soutiendrait ORM, ne pas le faire sentir comme un pas en arrière. – Bill

+1

LINQ to SQL * est * un ORM (de toutes sortes). Vous n'utilisez pas LINQ to SQL avec un ORM * différent *. D'autres ORM le remplacent. D'autres ORM peuvent ou non prendre en charge LINQ, mais la plupart le supportent. –

+0

Si Linq-Sql est un ORM, alors je m'attendrais à ce qu'il trouve comment faire des jointures automatiquement (d'où la partie relationnelle) au lieu de devoir les écrire moi-même .... – Bill

0

Qu'est-ce que vous pouvez faire si vous voulez créer un livre et que vous voulez directement ajouter une catégorie à elle est: selon vous:

 <p> 
      <label for="CategorySelect">Category:</label> 
      <%= Html.ListBox("CategorySelect") %> 
      <%= Html.ValidationMessage("CategorySelect", "*")%> 
     </p> 

dans votre bookscontroller:

 public ActionResult New() 
    { 
      var data = _entities.Categories.ToList(); 
     ViewData["CategorySelect"] = new MultiSelectList(data, "Id", "Name"); 
} 

     [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult New([Bind(Exclude = "Id")] Book Booknew) 
    { 
     IEnumerable<int> selectedCategories = Request["CategorySelect"].Split(new Char[] { ',' }).Select(idStr => int.Parse(idStr)); 

     if (!ModelState.IsValid) 
      return View(); 

     try { 
      foreach(var item in selectedCategories){ 
       BooksCategories bc = new BooksCategories(); 
       bc.Book = Booknew; 
       bc.CategoryId = item; 
       _entities.BooksCategories.InsertOnSubmit(bc); 
      } 
      _entities.Books.InsertOnSubmit(Booknew); 
      _entities.SubmitChanges();