Linq To Sql таблица «многие-многие» - PullRequest
10 голосов
/ 25 января 2009

Я несколько опытный разработчик Rails и подумал, что попробую версию ASP.NET MVC. При этом я также решил попробовать Linq-> Sql ...

Я немного озадачен тем, как Linq-> Sql обрабатывает соединения.

Тривиальный пример моей схемы:

книги
ID
название

категории
ID
Имя

books_categories
book_id
category_id

Просто перетаскивание этих таблиц в файл .dbml, похоже, не делает этого. Я получаю свойство в классе Book: books_categories, и я ожидаю, что это свойство, которое я могу перебрать и получить классы напрямую.

Прямо сейчас я должен сделать что-то, что кажется очень неправильным

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

[В ответ на принятый ответ]
Я неохотно принял ответ «напиши свой клеевой код». После продолжения моего исследования Linq-> Sql я обнаружил, что, по-видимому, его постепенно отпускают в пользу (более мощного, IMO) Entity Framework. EF по-прежнему позволяет использовать LINQ для запросов и неплохо справляется с выяснением отношений, таких как ActiveRecord в Ruby.

Ответы [ 4 ]

8 голосов
/ 25 января 2009

Используйте частичную реализацию класса для Book и добавьте соответствующие методы для категорий и их свойств. Имейте внешний интерфейс свойств для свойства 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 );
    }
}

Очевидно, вам нужно добавить некоторые проверки ошибок / границ и т. Д., Но вы поняли идею.

Я признаю, что это не идеально, но, по крайней мере, у вас есть возможность определить, как это работает.

2 голосов
/ 26 января 2009

Многие в многие отображения явно поддерживаются в Entity Framework, но не в LINQ to SQL. Вы также можете использовать сторонние ORM, такие как NHibernate.

0 голосов
/ 12 мая 2009

Что вы можете сделать, если хотите создать книгу и сразу добавить в нее категорию: на ваш взгляд:

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

в вашем контроллере книг:

        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();
0 голосов
/ 25 января 2009

Не думаю, что ваш ожидаемый результат поддерживается в Linq to Sql.

То, что вы делаете, может показаться неправильным, но я думаю, что это один из способов обойти это ограничение L2S.

Чувак, я действительно должен попасть в Rails ...

...