• 1401/06/26

ذخیره اطلاعات درون select2 با ef :

با سلام خدمت شما استاد گرامی

 من می خوام در هنگام ذخیره اطلاعات کتاب، هم زمان شناسه های چندین نویسنده رو در دیتابس ذخیره کنم برای این کار از داپدان لیست select2 استفاده کردم.

با هر بار ارسال اطلاعات به مشکل خالی بودن شناسه کتاب بر می خورم. این کار با EF Core2 امکان پذیر بود. ولی در ورژن 5 یا 6 نمی تونم این کار رو انجام بدم. 

متن پیغام خطا : 

InvalidOperationException: The value of 'Author_Book.BookId' is unknown when attempting to save changes. This is because the property is also part of a foreign key for which the principal entity in the relationship is not known.

کدهای ویومادل

public class BooksCreateViewModel
    {
        [Required(ErrorMessage = "وارد نمودن {0} الزامی است")]
        [Display(Name = "عنوان")]
        public string Title { get; set; }
        [Required(ErrorMessage = "وارد نمودن {0} الزامی است")]
        [Display(Name = "نویسندگان")]
        public int[] AuthorId { get; set; }
    }
    public class AuthorListVM
    {
        public int AuthorId { get; set; }
        public string NameFamily { get; set; }
    }

کدهای کنترلر Create برای نمایش

        [HttpGet]
        public IActionResult Create()
        {
            var AuthorNameFamily = _context.Authors.Select(t => new AuthorListVM
            {
                AuthorId = t.AuthorId,
                NameFamily = t.FullName
            });
            ViewBag.AuthorID = new SelectList(AuthorNameFamily, "AuthorId", "NameFamily");

            return View();
        }

کدهای کنترل Create برای ایجاد

[HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Create(int bookid,BooksCreateViewModel viewModel)
        {
            if (ModelState.IsValid)
            {
                Book book = new Book()
                {
                    Title = viewModel.Title,
                };
                _context.Books.Add(book);

                List<Author_Book> authors = new List<Author_Book>();

                for (int i = 0; i < viewModel.AuthorId.Length; i++)
                {
                    Author_Book author = new Author_Book()
                    {
                        BookId = book.BookId,
                        AuthorId = viewModel.AuthorId[i],
                    };
                    authors.Add(author);
                }
                _context.Author_Books.AddRangeAsync(authors);

                _context.SaveChanges();
                return RedirectToAction("Index");
            }

            var AuthorNameFamily = _context.Authors.Select(t => new AuthorListVM
            {
                AuthorId = t.AuthorId,
                NameFamily = t.FullName
            });
            ViewBag.AuthorID = new SelectList(AuthorNameFamily, "AuthorId", "NameFamily");
            return View(viewModel);
        }

ممنون می شم اگه وقت بگذارید و کمک کنید

با تشکر

اگه امکان ارسال کد هم هست بفرمایید کل کدهای ایجاد شده رو در اختیارتون بگذارم

  • 1401/06/28
  • ساعت 16:07

سلام دوست من وقتون بخیر

دوست عزیز لطفا از بریک پوینت استفاده کنید و بببنید AuthorId های شما کاملا بدون مشکل هستند یا نه در صورتی که مشکلی در این قسمت وجود نداشت اعلام کنید

با تشکر


  • 1401/06/28
  • ساعت 22:05

سلام خدمت شما. خیر مشکلی ندارند. شناسه هر دو انتخاب وارد حلقه می شوند. اما شناسه کتاب 0 است.

طبق تصویر زیر :

تشکر از وقتی که می گذارید.


  • 1401/06/30
  • ساعت 09:40

سلامت باشید دوست عزیز

لطفا بعد از اینکه book رو اضافه کردین از دستوری SaveChange استفاده کنید و بعد مجددا تست کنید


  • 1401/06/30
  • ساعت 15:05

سلام. بله درست می فرمایید با این روش مشکل برطرف می شود. اما مشکلی که هست، اگه در بین عملیات ذخیره سازی به مشکلی بر بخوریم. اطلاعات کتاب بصورت نصفه ذخیره می شود. یعنی تمامی مراحل ذخیره می شوند تا جایی که خطا تولید شود. برای اطلاع عرض می کنم  این مشکل رو توسط Transaction تونستم کنترل کنم. که در صورت بروز مشکل، کل مراحل قبلی که در بانک ذخیره شده بوند، لغو می شوند. 

خیلی خیلی سپاسگذارم از وقتی که گذاشتید.   تشکر


  • 1401/07/01
  • ساعت 14:10

سلامت باشید دوست عزیز 

خداروشکر مشکل رفع شد و روشی که استفاده کردین هم درسته 

موفق باشید دوست من


logo-enamadlogo-samandehi