Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 2
Регистрация: 18.03.2012
Сообщений: 253
1

Заполнение таблиц с связью многие-ко-многим

21.11.2014, 22:16. Показов 2591. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть две таблицы Artists и Performers. Между ними установлена связь многие ко многим и автоматически создана таблица связки Groups средствами EntityFramework. По задумке я создаю артиста, а уже участника(исполнителя (гитарист, солист и т.д.)) я привязываю к некоему "Артисту" .
У меня не получается создать представление в котором я могу задать нужные мне данные исполнителю (Performer) , и что бы у меня появлялся список где я могу выбрать для (Performer) артиста и таким образом привязать одного исполнителя к нескольким артистам .
Код прилагается:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       
 [HttpGet]
        public ActionResult CreatePerformer()
        {
            SelectList artist = new SelectList(db.Artists, "ArtistId", "Name");
            ViewBag.Artists = artist;
            return View();
        }
        [HttpPost]
        public ActionResult CreatePerformer(Performer performer)
        {
            db.Performers.Add(performer);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
представление:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@using MusicStoreProg.Models
@model Performer
@{
    ViewBag.Title = "CreatePerformer";
}
 
<h2>CreateP</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
 
 
@using (Html.BeginForm())
{@Html.ValidationSummary(true)
    
    <fieldset>
        <legend>
            Performer
        </legend>
        <div class="editor-label">
            @Html.LabelFor(model=>model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model=>model.Name)
            @Html.ValidationMessageFor(model=>model.Name)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model=>model.Position)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model=>model.Position)
            @Html.ValidationMessageFor(model=>model.Position)
        </div>
       <div class="editor-label">
           <!--   ??????-->
        </div>
<div class="editor-field">
       <!--   ??????-->
        </div>
 
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}
Контекст:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   public class MusicStoreContext : DbContext
    {
       
        public DbSet<Artist> Artists { get; set; }
      
       
        public DbSet<Performer> Performers { get; set; }
        
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Artist>().HasMany(c => c.Performers)
                .WithMany(s => s.Artists)
                .Map(t => t.MapLeftKey("ArtistId")
                    .MapRightKey("PerformerId")
                    .ToTable("Groups"));
 
      
                
        }
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2014, 22:16
Ответы с готовыми решениями:

Модель со связью многие-ко-многим
Уже голова кругом :wall: (Учусь на MVC 5) Есть класс User и Command со связью многие ко многим. ...

Сохранение данных со связью многие-ко-многим
Здравствуйте, делаю сохранение данных, связь многие-ко-многим, то есть, например, у меня есть...

Выборка из связанных таблиц (многие-ко-многим)
Классический случай: таблица книг, таблица авторов, промежуточная таблица. -8 8- Можно ли...

Выбрать из таблиц со связью многие ко многим
Здравствуйте! Помогите составить запрос. Суть такая: имеются две таблицы, между ними связь многие...

2
26 / 26 / 5
Регистрация: 29.05.2013
Сообщений: 151
22.11.2014, 02:17 2
ошибка
0
2 / 2 / 2
Регистрация: 18.03.2012
Сообщений: 253
22.11.2014, 13:28  [ТС] 3
ну я знаю что я здесь допустил ошибку. У меня сгенерирована таблица связки. Я единственное что не могу сделать , так это реализовать возможность в представлении выбирать из списка нужного Artist моему Performer . В конечном итоге это должно отобразится в таблице связки . добавляю код классов Artist и Performer.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Artist
    {
        [Key]
        [ScaffoldColumn(false)]
 
        public int ArtistId { get; set; }
        
        [Required(ErrorMessage = "Назва повинна бути встановленою")]
        [DisplayName("Name")]
        public string Name { get; set; }
 
        public virtual ICollection<Performer> Performers { get; set; }
        
 
 
 
      
        public class Performer
    {
        [Key]
        public int PerformerId { get; set; }
       
        public string Name { get; set; }
       
        public string Position { get; set; }
       
        public virtual ICollection<Artist> Artists { get; set; }
 
    }
    }
Добавлено через 12 минут
Я еще другим способом сделал, правда я сначала создавал просто Performer а уже потом через метод Edit устанавливал ему Artist . Представление работало но после выбора артиста и сохранения вылетал ексепшн. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MusicStoreProg.Models;
 
namespace MusicStoreProg.ViewModels
{
    public class ArtistViewModel
    {
         public Performer Performer { get; set; }
         public IEnumerable<SelectListItem> AllArtist { get; set; }
       
         private List<int> _selectedArtists;
        
        public List<int> SelectedArtists
     {
         get
         {
             if(_selectedArtists==null)
    
             {
         _selectedArtists=Performer.Artists.Select(m=>m.ArtistId).ToList()/ //////в этом месте был ексепшн  //ArgumenNullException
                 }                                                  
                  return _selectedArtists;
     
         }
             set
             {
                   _selectedArtists = value;
             }
       }
   }
 
}
А вот сам метод изменения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  public ActionResult EditP(int? id)
        {
            if(id==null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var artistviewModel = new ArtistViewModel
            {
                Performer = db.Performers.Include(i => i.Artists).First(i => i.PerformerId == id)
            };
            if (artistviewModel.Performer == null)
                return HttpNotFound();
            var allartistList = db.Artists.ToList();
 
            artistviewModel.AllArtist = allartistList.Select(o => new SelectListItem
                {
                    Text = o.Name,
                    Value = o.ArtistId.ToString()
                });
 
            return View(artistviewModel);
 
        }
        [HttpPost]
        public ActionResult EditP(ArtistViewModel artistViewModel)
        {
            if (artistViewModel == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
 
            if (ModelState.IsValid)
            {
                var perftoUpdate = db.Performers
                    .Include(i => i.Artists).First(i => i.PerformerId == artistViewModel.Performer.PerformerId);
                if (TryUpdateModel(perftoUpdate, "Performer", new string[] { "Name", "Position" }))
                {
                    var newArtist = db.Artists.Where(
                        m => artistViewModel.SelectedArtists.Contains(m.ArtistId)).ToList();
                    var updateArtist = new HashSet<int>(artistViewModel.SelectedArtists);
                    foreach (Artist artist in db.Artists)
                    {
                        if (!updateArtist.Contains(artist.ArtistId))
                        {
                            perftoUpdate.Artists.Remove(artist);
                        }
                        else
                        {
                            perftoUpdate.Artists.Add((artist));
                        }
                    }
                    db.Entry(perftoUpdate).State = EntityState.Modified;
                    db.SaveChanges();
                }
                return RedirectToAction("Index");
            }
            return View(artistViewModel);
        }
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@model MusicStoreProg.ViewModels.ArtistViewModel
@{
    ViewBag.Title = "EditP";
}
 
<h2>EditP</h2>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
   
    <h4>Performer</h4>
   <div class="editor-field">
       @Html.LabelFor(model=>model.Performer.Name) 
   </div>
    <div class="editor-label">
        @Html.EditorFor(model=>model.Performer.Name)
        @Html.ValidationMessageFor(model=>model.Performer.Name)
    </div>
    <div class="editor-field">
       @Html.LabelFor(model=>model.Performer.Position) 
   </div>
    <div class="editor-label">
        @Html.EditorFor(model=>model.Performer.Position)
        @Html.ValidationMessageFor(model=>model.Performer.Position)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model=>model.AllArtist,"Artist")
 
    </div>
       <div class="editor-field">
           @Html.ListBoxFor(m=>m.SelectedArtists,Model.AllArtist)
       </div>     
    <p>
        <input type="submit" value="Save" />
    </p>
}
Добавлено через 50 минут
0
22.11.2014, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2014, 13:28
Помогаю со студенческими работами здесь

Отображение таблиц со связью многие ко многим
Есть две таблицы, между которыми установлена связь многие ко многим, через третью таблицу:...

Запрос из таблиц со связью "многие-ко-многим" с несколькими связями с промежуточной таблицей
Я разрабатываю БД для организации по продаже запчастей. Новые (ещё не выполненные) заказы хранят...

Заполнение таблиц многие ко многим - Как добавлять в корзину сразу несколько фруктов?
Добрый день! В существующей БД со связью многие ко многим заполнение формы &quot;Урожай&quot; реализовано...

Представление данных со связью многие-ко-многим
Добрый день, форумчане! Итак, есть простенькая база данных MS ACCESS. Связи между таблицами: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru