C# ASP.NET MVC birebir ilişkiye sahip sınıfları aynı aksiyonda oluşturup ilişkilendirmek mümkün mü?

Chucker

Kilopat
Katılım
25 Ağustos 2016
Mesajlar
475
Çözümler
3
Daha fazla  
Cinsiyet
Erkek
Veri tabanında tabloları temsil eden iki sınıfım var ve birebir ilişkiye sahipler, controller üzerinde create aksiyonunda ikisini aynı anda oluşturup birbirlerine atamam gerekiyor fakat başaramadım, böyle bir şey yapmak mümkün müdür?

C#:
public async Task<IActionResult> Create(CreatePostVM viewModel)
        {
            if (ModelState.IsValid)
            {
                var user = await _userManager.GetUserAsync(User);

                Car car = new Car
                {
                    Make = viewModel.Make,
                    Model = viewModel.Model,
                    Year = viewModel.Year,
                    Kilometer = viewModel.Kilometer,
                    HorsePower = viewModel.HorsePower,
                    LocationCountry = viewModel.LocationCountry,
                    LocationCity = viewModel.LocationCity,
                    CategoryId = viewModel.CategoryId,
                    FuelTypeId = viewModel.FuelTypeId,
                    TransmissionTypeId = viewModel.TransmissionTypeId,
                    CarExtras = new List<CarExtra>(),
                    Images = new List<Image>(),
                };

                Post post = new Post()
                {
                    Title = viewModel.Title,
                    Description = viewModel.Description,
                    Price = viewModel.Price,
                    CoverImage = viewModel.CoverImage,
                    CreatorId = user.Id,
                    Car = car
                };

             

                if (viewModel.SelectedExtras != null)
                {
                    foreach (var extra in viewModel.SelectedExtras)
                    {
                        var carExtra = new CarExtra()
                        {
                            CarId = post.CarId,
                            ExtraId = extra
                        };
                        post.Car.CarExtras.Add(carExtra);
                    }
                }

                if (viewModel.SelectedImages != null && viewModel.SelectedImages.Count > 0)
                {
                    foreach (var file in viewModel.SelectedImages)
                    {
                        var fileName = Path.GetFileName(file.FileName);
                        var fileExtension = Path.GetExtension(fileName);
                        var uniqueFileName = Guid.NewGuid().ToString() + fileExtension;
                        var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images", uniqueFileName);
                        using (var stream = new FileStream(filePath, FileMode.Create))
                        {
                            file.CopyTo(stream);
                        }
                        var image = new Image()
                        {
                            CarId = post.CarId,
                            Path = fileName
                        };
                        post.Car.Images.Add(image);
                    }
                }

                _db.Posts.Add(post);
             

                await _db.SaveChangesAsync();
            }
            else
            {
                var errors = ModelState.Select(x => x.Value.Errors)
                           .Where(y => y.Count > 0)
                           .ToList();
                return BadRequest(errors);
            }


            return RedirectToAction("GetAll");
        }

Bu arada veri tabanında cars tablosuna da posts tablosuna da veri ekleniyor fakat birbirleriyle bağlantılı değiller, Posts tablosunda "CarId" sütunu hep "0" değerini alıyor.

Ekran görüntüsü 2023-05-27 163118.png
 
Son düzenleyen: Moderatör:
Savechanges methodunu çağırmadığın için ID değerleri 0 gelir. SaveChanges methodundan sonra DB'ye eklediğin her yeni data için ID atanır.
Yani Car datasını ekledikten sonra car için bir ID oluşması için savechanges methodunu çağırmalısın.
 
Maalesef sonuç aynı hocam. Aynı action içerisinde yapmaya çalıştığımdan mı bir problem var acaba?
 
Anladığım kadarıyla her araba için bir post, her bir postun da bir arabası var. Bu durumda araba sınıfına public int postıd ve public post post, post sınıfına ise carıd ve car ı aynı şekilde tanımlarız. Postu oluşturuken sadece carıd veririz ve sonra çağırırken de _db. Posts. Include(e => e. Car) ile post sınıfına en başta eklediğimiz car propertysini (public car car olarak tanımladığımızı) doldururuz.
 
Anladığım kadarıyla her araba için bir post, her bir postun da bir arabası var. Bu durumda araba sınıfına public int postıd ve public post post, post sınıfına ise carıd ve car ı aynı şekilde tanımlarız. Postu oluşturuken sadece carıd veririz ve sonra çağırırken de _db. Posts. Include(e => e. Car) ile post sınıfına en başta eklediğimiz car propertysini (public car car olarak tanımladığımızı) doldururuz.
Siz söyledikten sonra belki ilişkiyi yanlış kurmuşumdur diye kontrol edeyim dedim, evet sorun oradaymış. İlişkiyi düzelttikten sonra artık sıkıntısız çalışıyor.
 

Geri
Yukarı