‫۱۰ سال و ۹ ماه قبل، سه‌شنبه ۲۴ دی ۱۳۹۲، ساعت ۱۵:۴۳
متوجه هستم که منشأ این حذف از کجاست، اما سوال من این است که چگونه میتوان بدون اینکار، یعنی حذف کردن و اضافه کردن مجدد لینکها در دیتابیس؛ بروز رسانی را انجام داد، تا در مواردی که تعداد و حجم این رکوردها بالاست، کارایی پایین نیاید؟(اگر تغییری در لینکها رخ نداده؛ اتفاقی نیافتد و چنانچه لینکی عوض شده، رکورد مربوطه درصورتی که از قبل در DB وجود داشته، ,Update شود و تنها اگر جدید است Insert شود؟)
‫۱۰ سال و ۹ ماه قبل، سه‌شنبه ۲۴ دی ۱۳۹۲، ساعت ۱۴:۵۳
مشکل از متد Update ایی که گذاشتید نیست. در کنترلری که در تصویر مشخص شده، ابتدا downloadLinkService.RemoveByPostId هست و بعد postService.UpdatePost . یعنی این Insert اضافی بخاطر Remove ایی است که در اکشن متد EditPost فایل PostController.cs ناحیه ادمین صورت گرفته (Controller: Admin.PostController.editpost).
‫۱۰ سال و ۹ ماه قبل، سه‌شنبه ۲۴ دی ۱۳۹۲، ساعت ۱۴:۳۵
بله همانطور که گفتم موقع ویرایش یک پست که قبلا برایش لینک دانلود ثبت شده، حتی اگر هیچ تغییری هم در لینکهای دانلود ندهیم، کوئری Insert صادر میشود.
این هم نمونه خروجی Sql تولید شده برای حالت فوق که توسط mini-profiler ایجاد شده:

و این هم کد متد UpdatePost:
public UpdatePostStatus UpdatePost(EditPostModel postModel)
        {
            Post selectedPost = _posts.Find(postModel.PostId);

            int count = selectedPost.Labels.Count;
            for (int i = 0; i < count; i++)
            {
                selectedPost.Labels.Remove(selectedPost.Labels.ElementAt(i));
                count--;
            }

            selectedPost.Labels = postModel.Labels;

            selectedPost.DownloadLinks = postModel.DownloadLinks;

            selectedPost.Body = postModel.PostBody;
            selectedPost.Book.Author = postModel.Book.Author;
            selectedPost.Book.ISBN = postModel.Book.ISBN;
            selectedPost.Book.Language = postModel.Book.Language;
            selectedPost.Book.Name = postModel.Book.Name;
            selectedPost.Book.Page = postModel.Book.Page;
            selectedPost.Book.Year = postModel.Book.Year;
            selectedPost.Book.Description = postModel.Book.Description;
            selectedPost.Book.Publisher = postModel.Book.Publisher;

            selectedPost.Book.Image.Description = postModel.BookImage.Description;
            selectedPost.Book.Image.Path = postModel.BookImage.Path;
            selectedPost.Book.Image.Title = postModel.BookImage.Title;

            selectedPost.CommentStatus = postModel.PostCommentStatus;
            selectedPost.Description = postModel.PostDescription;
            selectedPost.Keyword = postModel.PostKeyword;
            selectedPost.ModifiedDate = postModel.ModifiedDate;
            selectedPost.Status = postModel.PostStatus;
            selectedPost.Title = postModel.PostTitle;

            return UpdatePostStatus.Successfull;
        }

‫۱۰ سال و ۹ ماه قبل، سه‌شنبه ۲۴ دی ۱۳۹۲، ساعت ۱۳:۳۶
رسم متداولش همین است. کوئری SQL آن‌را Trace کردید؟ آیا مطمئن هستید که اصلا کوئری خاصی صادر می‌شود؟ چون سیستم Tracking حاصل از متد توکار Find، چنین اجازه‌ای رو نمی‌ده و برای فیلدهایی که تغییری نداشتند update صادر نمی‌کنه. اثبات این مساله نیاز به ردیابی SQL تولیدی داره.
‫۱۰ سال و ۹ ماه قبل، پنجشنبه ۵ دی ۱۳۹۲، ساعت ۰۶:۰۵
با سلام
دلیل اینکه رابطه یک به چند شده این است که در کلاس UserMetaData کلید از نوع long میباشد که با  تغییر  آن به نوع int رابطه به صورت یک به یک میگردد 

 
‫۱۰ سال و ۱۰ ماه قبل، جمعه ۱ آذر ۱۳۹۲، ساعت ۲۳:۰۲
سلام؛ ممنون
اگر به این سطر دقت کرده باشید در کلاس UserConfig:
HasOptional(x => x.UserMetaData).WithRequired(x => x.User).WillCascadeOnDelete(false);
درست است رابطه از دید دیتابیس یک به چند است ولی در هنگام کار با EntityFramework رابطه یک یه یک است و ما از یک به چند بودن نمی‌توانیم استفاده کنیم. دلیلش هم ذکر HasOptional است و این امر در رابطه‌ی یک یه یک امکان پذیر نیست.
البته این نکته را متذکر شوم که طراحی دیتابیس این سیستم ممکن است ایراداتی نیز داشته باشد و کاملا بدون نقص نیست.
‫۱۰ سال و ۱۰ ماه قبل، دوشنبه ۲۷ آبان ۱۳۹۲، ساعت ۰۲:۱۶
connectionstring تعریف شده پیش فرض را دستکاری کرده اید؟
یا به entity framework 6 اپدیت کردید؟
اگه رشته‌ی اتصالی با نام IrisDbContext را دستکاری نکرده باشید نباید مشکلی داشته باشه.