2009-01-24 60 views
10

我是一個有點經驗的Rails開發人員,我想我會嘗試ASP.NET的MVC版本。在這樣做,我也決定嘗試Linq-> Sql ...Linq To Sql許多許多聯接表

我對Linq-> Sql處理連接的方式有點困惑。

我的架構的一個簡單的例子是:


ID
標題


ID

books_categories
book_id
CATEGORY_ID

只要這些表拖動到.dbml文件似乎並沒有做到這一點。我在Book類books_categories上獲得了一個屬性,我期望的是一個可以迭代並直接獲取Category類的屬性。

現在我要做的東西,感覺很不對勁

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

[針對接受的答案]
我勉強接受的「寫你自己的膠水代碼」的答案。在繼續我對Linq-> Sql的研究之後,我發現它顯然正在慢慢地被放棄以支持(更強大的IMO)實體框架。 EF仍然允許使用LINQ進行查詢,並且可以很好地計算出Ruby的ActiveRecord之類的關係。

回答

8

使用部分類實現了圖書,並添加適當的方法類別及其特性。使屬性前端爲Books_Categories屬性(您可以使其具有私有可見性,以強制實現您的Categories屬性)。

public partial class Books 
{ 
    public IEnumerable<string> CategoryNames 
    { 
     get 
     { 
      return this.Books_Categories 
         .Select(bc => bc.Category.category.Trim()); 
     } 
    } 

    public void AddCategory(Category category) 
    { 
     this.Books_Categories.Add(new Book_Category 
            { 
             Category = category, 
             Book = this 
            }); 
    } 

    public void RemoveCategory(Category category) 
    { 
     var bc = this.Book_Categories 
        .Where(c => c.Category == category) 
        .SingleOrDefault(); 
     this.Books_Categories.Remove(bc); 
    } 
} 

很明顯,你需要添加一些錯誤/邊界檢查等,但你明白了。

我會告訴你這並不理想,但至少你可以靈活地確定它是如何工作的。

+0

止跌」:

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

:在你看來 您只能在添加和刪除方法中將Book_Category添加到this.Book_Categories中? – 2009-04-14 16:12:37

+0

編輯錯誤 - 我可能鍵入了代碼然後重命名屬性。將更新。 – tvanfosson 2009-04-14 16:15:20

0

我不認爲您的預期結果在Linq to Sql中受支持。

你在做什麼可能會覺得不對,但我認爲這是解決L2S限制的一種方法。

男人,我真的得讓Rails的...

2

實體框架中顯式支持多對多映射,但不支持LINQ to SQL。您也可以使用NHibernate等第三方ORM。

0

,如果你想創建一本書,並希望直接到某個類別添加到它,你可以做的是:

 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();