مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

mrpeach

عضویت از 1394/04/13

رایطه یک به چند

  • سه شنبه 8 دی 1394
  • 21:25
تشکر میکنم

سلام من چند تا تاپیک ثبت کردم برای این موضوع ولی هیچ جوابی نگرفتم 

چه طور می تونم رابطه یم به چند داخل C# و MVC5 در روش code first پیاده سازی کنم

لطفا اگه ممکنه بهم کمک کنید

با تشکر

پاسخ های این پرسش

تعداد پاسخ ها : 10 پاسخ
کاربر سایت

علی تمیمی

عضویت از 1393/06/27

  • چهارشنبه 9 دی 1394
  • 00:02

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

 فرض کنید  یک کلاس (یا همان جدول ) به نام Product   و یک کلاس ( یا همان جدول ) به نام Group داریم

 حال برای تحیل این گونه است که هر محصول  یک گروه دارد ولی هر گروه میتواند متعلق به چند محصول باشد در واقع   همان 1 (گروه) به چند ( محصول ) است

حال در روش code first  به صورت زیر عمل میکنیم

 public class Groups
    {
        public Groups()
        {
            
        }
        [Key]
        public int GroupID { get; set; }
        [Display(Name = "گروه ")]
        [MaxLength(200)]
        [Required(AllowEmptyStrings = false, ErrorMessage = "لطفا {0} را وارد کنید ")]
        public string GroupTitle { get; set; }

        
    }

 

کلاس Prodcut  را در نظر بگیرید

 public class Product
    {
        public Product()
        {

        }
        [Key]
        public int PostID { get; set; }
        [Required]
 
       
        public int GroupID { get; set; }

        public string Description { get; set; }

حال همان طور که مشاهده کردید در کلاس Product یک فیلد به نام Group ID    در نظر گرفته ایم

 حال بر ای بر قراری رابطه ها : در کلاس Group  یک پراپرتی   که لیستی از product  است را ایجاد میکنیم

 public virtual List<Posts> Product { get; set; }

و در اخر کلاس Group به صورت زیر است

  public class Groups
    {
        public Groups()
        {
            
        }
        [Key]
        public int GroupID { get; set; }
        [Display(Name = "گروه ")]
        [MaxLength(200)]
        [Required(AllowEmptyStrings = false, ErrorMessage = "لطفا {0} را وارد کنید ")]
        public string GroupTitle { get; set; }

        public virtual List<Posts> Product { get; set; }
    }

 

حال در کلاس Product  یک پراپرتی از نوع کلاس Group ایجاد میکنیم

       public virtual PostGroups Groups { get; set; }

 

ودر اخر کلاس Product به صورت زیر است

    public class Product
    {
        public Product()
        {

        }
        [Key]
        public int PostID { get; set; }
        [Required]
        public int UserID { get; set; }
        [Required]
        public int GroupID { get; set; }
       

        public virtual PostGroups Groups { get; set; }

  

    }

این نکته هم حائز اهمیت است که  در روش code first حتما باید یک سازنده از نوع کلاس و همچنین برای رابطه ها از کلمه کلیدی virtual  استفاده کنید


 

  امیدوارم توانسته باشم بهتون کمک کنم 

کاربر سایت

mrpeach

عضویت از 1394/04/13

  • چهارشنبه 9 دی 1394
  • 00:19

کاملا درسته

من یک کلاس دارم به نام Category

public class Category : Create
    {
        public Category()
        {
 
        }
 
        [System.ComponentModel.DataAnnotations.Required]
        [System.ComponentModel.DataAnnotations.MaxLength(50)]
        public string Title { get; set; }
 
        [System.ComponentModel.DataAnnotations.MaxLength(50)]
        public string Parent { get; set; }
 
        public virtual System.Collections.Generic.IList<Article> Article { get; set; }
    }

 

و یک کلاس دیگر به اسم Article

public class Article : Status
    {
        public Article()
        {
 
        }
 
        [System.ComponentModel.DataAnnotations.Required]
        [System.ComponentModel.DataAnnotations.MaxLength(50)]
        public string Title { get; set; }
 
        [System.ComponentModel.DataAnnotations.Required]
        public string Body { get; set; }
 
        [System.ComponentModel.DefaultValue("1")]
        public int Hit { get; set; }
 
        [System.ComponentModel.DataAnnotations.MaxLength(50)]
        public string Image { get; set; }
 
        [System.ComponentModel.DisplayName("Category")]
        [System.ComponentModel.DataAnnotations.Required]
        public Guid Category_ID { get; set; }
 
        public virtual Category Category { get; set; }
    }

و داخل databasecontext  این کد را دارم

 

ublic System.Data.Entity.DbSet<Article> Article { get; set; }

ublic System.Data.Entity.DbSet<Category> Category{ get; set; }

 

حالا مدل خودم را از controller با این دستور به view پاس می دهم 

return View(db.Articles.Include(a => a.Category).ToList());

و می خواهم که داخل view Index Article نام یا همون title Category را با این دستور نشان بدهم 

@item.Category.Title

که اررور میده میگه مقدار null هستش داخل جدول دیتا بیس هم قسمت Category خالیه 

آیا من باید موقع ذخیره کردن چیزی داخل Category دخیره کنم؟

یا من کد اضافه تری باید بنویسم که ننوشتم

 

کاربر سایت

علی تمیمی

عضویت از 1393/06/27

  • چهارشنبه 9 دی 1394
  • 00:22

تصویری از خطا را درج میکنید

کاربر سایت

mrpeach

عضویت از 1394/04/13

  • چهارشنبه 9 دی 1394
  • 00:28

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

 
کاربر سایت

mrpeach

عضویت از 1394/04/13

  • چهارشنبه 9 دی 1394
  • 00:50

آیا نباید nuget خاصی نصب کنم؟

کاربر سایت

علی تمیمی

عضویت از 1393/06/27

  • چهارشنبه 9 دی 1394
  • 01:05

ی چند تا سوال این که id که از نوع Guid است ایا در کلاس های Create و  Status  در سازنده این کلاس ها از ان new گرفته اید یا نه ؟  و اگر این کلاس ها هم بگذارید  شاید بتونم بهتر کمکتون کنم

در ضمن مثالی که در بالا براتون زدم را در زیر ضمیمه کردم

کد کلاس ها  به همانی است که در بالا عرض کردم متد index هم مثل شما ست حال اگر بازهم  مشکل حل نشد کد را ضمیمه کنید تا براتون حل کنیم

 

فایل های ضمیمه

کاربر سایت

mrpeach

عضویت از 1394/04/13

  • چهارشنبه 9 دی 1394
  • 01:10

کلاس Create:

public class Status : Create
    {
        public Status()
        {

        }

        public bool StatusField { get; set; }
    }

کلاس Status:

public class Create : Key
    {
        public Create()
        {

        }
        public DateTime CreateDate { get; set; }

        [System.ComponentModel.DataAnnotations.MaxLength(255)]
        public string CreateByUser { get; set; }
    }

کلاس key:

public class Key
    {
        public Key()
        {
            ID = System.Guid.NewGuid();
        }

        [System.ComponentModel.DataAnnotations.Key]
        public Guid ID { get; set; }
    }

 

کاربر سایت

mrpeach

عضویت از 1394/04/13

  • چهارشنبه 9 دی 1394
  • 01:15

من این دو کار رو هم انجام دادم

Install-Package Entityframework

Install-Package Microsoft.aspnet.Identity.Samples -pre

 

کاربر سایت

علی تمیمی

عضویت از 1393/06/27

  • چهارشنبه 9 دی 1394
  • 01:20

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

کاربر سایت

mrpeach

عضویت از 1394/04/13

  • چهارشنبه 9 دی 1394
  • 01:49

متاسفانه اشتباه بزرگ من این بود که می بایست در هر دو یک فیلد یکسان از لحاظ نوع و اسم می بود

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)