سلام من چند تا تاپیک ثبت کردم برای این موضوع ولی هیچ جوابی نگرفتم
چه طور می تونم رابطه یم به چند داخل C# و MVC5 در روش code first پیاده سازی کنم
لطفا اگه ممکنه بهم کمک کنید
با تشکر
سلام دوست عزیز
فرض کنید یک کلاس (یا همان جدول ) به نام 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 استفاده کنید
امیدوارم توانسته باشم بهتون کمک کنم
کاملا درسته
من یک کلاس دارم به نام 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 دخیره کنم؟
یا من کد اضافه تری باید بنویسم که ننوشتم
تصویری از خطا را درج میکنید
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.
آیا نباید nuget خاصی نصب کنم؟
ی چند تا سوال این که id که از نوع Guid است ایا در کلاس های Create و Status در سازنده این کلاس ها از ان new گرفته اید یا نه ؟ و اگر این کلاس ها هم بگذارید شاید بتونم بهتر کمکتون کنم
در ضمن مثالی که در بالا براتون زدم را در زیر ضمیمه کردم
کد کلاس ها به همانی است که در بالا عرض کردم متد index هم مثل شما ست حال اگر بازهم مشکل حل نشد کد را ضمیمه کنید تا براتون حل کنیم
کلاس 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; } }
من این دو کار رو هم انجام دادم
Install-Package Entityframework Install-Package Microsoft.aspnet.Identity.Samples -pre
به نظرمن شما باید اسم ونوع فیلدی که در هر دو کلاس استفاده کرده اید را هم نام و هم نوع باشند
متاسفانه اشتباه بزرگ من این بود که می بایست در هر دو یک فیلد یکسان از لحاظ نوع و اسم می بود
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)