PDA

View Full Version : سوال: چگونگی وارد کردن اطلاعات در جداولی که ارتباط چند به چند دارند



kamran_14
سه شنبه 05 دی 1396, 10:01 صبح
سلام
خسته نباشید
من خودم ASP.NET MVC رو شروع کردم می‌خوام بخونم
اما کمک هیچ کسی رو به جز شما ندارم
من می‌خواستم یک ارتباط چند به چند رو پیاده کنم
اما خطا می‌ده فکر کنم به خاطر اینکه هنوز مقداری برای پراپرتی User در کلاس Group ندادم این خطا به خاطر اونه اما من lazyloading رو True کردم و قبل از نام پراپرتی از کلمه virtual استفاده کردم
واقعا نمی‌دونم مشکل چیه
خواهشا کد من رو بررسی کنید و کد دیگه و یا راه حل دیگه نمی‌خوام. ممنون
اینم سورس کد من:
من می‌خوام ارتباط چند به چند رو بررسی کنم برای همین 2 تا جدول user و Group ایجاد کردم و بعد گروه‌هایی رو از طریق پراپرتی Group که مربوط به جدول user است می‌خوام اضافه کنم که خطا میده مقدار آبجکت set نشده

من 3 تا کلاس ایجاد کردم یکیش که مربوط به پایگاه داده است
کلاس MyDB
کلاس User
کلاس Group

کلاس myDB:


using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;


namespace WindowsFormsApplication2.Models
{
class MyDB:DbContext
{
static MyDB()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyDB>());
}
public MyDB()
{
Configuration.LazyLoadingEnabled = true;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new Group.Config());
}
public virtual DbSet<Group> Groups { get; set; }
public virtual DbSet<User> Users { get; set; }
}
}


کلاس User:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace WindowsFormsApplication2.Models
{
class User
{
public User()
{
ID = System.Guid.NewGuid();
}
public System.Guid ID { get; set; }
public string Name { get; set; }
public virtual IList<Group> Groups { get; set; }
}
}


کلاس Group:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace WindowsFormsApplication2.Models
{
class Group
{
internal class Config:System.Data.Entity.ModelConfiguration.Entit yTypeConfiguration<Group>
{
public Config()
{
HasMany(c => c.Users).WithMany(u => u.Groups).Map(c=>{
c.ToTable("UserGroup");
c.MapLeftKey("GroupId");
c.MapRightKey("UserId");
});
}
}
public Group()
{
ID = System.Guid.NewGuid();
}
public System.Guid ID { get; set; }
public string Name { get; set; }
public virtual IList<User> Users { get; set; }
}
}


و در رویداد کلیک دکمه‌ای بعد از دادن مقادیر به user و group از طریق پراپرتی Group مربوط به user خواستم گروه ها رو اضافه کنم اینم کد:


using System;using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApplication2.Models;


namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void btnAddNewRecord_Click(object sender, EventArgs e)
{
MyDB oMyDB = null;
try
{
oMyDB = new MyDB();
Group oGroup = null;
User oUser = null;


oGroup = new Group();
oGroup.Name = "Group 1";
oMyDB.Groups.Add(oGroup);


oGroup = new Group();
oGroup.Name = "Group 2";
oMyDB.Groups.Add(oGroup);


oGroup = new Group();
oGroup.Name = "Group 3";
oMyDB.Groups.Add(oGroup);


oUser = new User();
oUser.Name = "User 1";
oMyDB.Users.Add(oUser);


oUser = new User();
oUser.Name = "User 2";
oMyDB.Users.Add(oUser);


oMyDB.SaveChanges();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (oMyDB!=null)
{
oMyDB.Dispose();
oMyDB = null;
}
}
}


private void btnAddGroupUser_Click(object sender, EventArgs e)
{
MyDB oMyDB = null;
try
{
Group oGroup1 = oMyDB.Groups.Where(c => c.Name == "Group 1").FirstOrDefault();
Group oGroup2 = oMyDB.Groups.Where(c => c.Name == "Group 2").FirstOrDefault();
User oUser1 = oMyDB.Users.Where(u => u.Name == "User 1").FirstOrDefault();


oUser1.Groups.Add(oGroup1);
oUser1.Groups.Add(oGroup2);
oMyDB.SaveChanges();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (oMyDB!=null)
{
oMyDB.Dispose();
oMyDB = null;
}
}
}
}
}



من

parvizwpf
سه شنبه 05 دی 1396, 10:08 صبح
الان این mvc هست؟ خطایی که میده رو بگذارید و کدوم خط خطا داره؟. شاید لازم باشه به هر گروهی آیدی یوزر مورد نظرش رو بدید و ست کنید.

kamran_14
سه شنبه 05 دی 1396, 10:25 صبح
الان این mvc هست؟ خطایی که میده رو بگذارید و کدوم خط خطا داره؟. شاید لازم باشه به هر گروهی آیدی یوزر مورد نظرش رو بدید و ست کنید.







چون باید Entity framework هم بلد می‌شدم من این کد را در windows form Application نوشتم
عین این کد رو استاد داریوش تصدیقی هم نوشته ولی مال اون اجرا می‌شه ولی مال من خطا می‌ده خیلی عجیبه من کدهای ایشون رو عینا کپی کردم اما نشد حتی اطلاعاتی که ایشون وارد کرده من هم وارد میکنم.
خطا:
object refrence not set to as instance of an object

parvizwpf
سه شنبه 05 دی 1396, 10:36 صبح
میشه بگید کدوم خط؟ این ارور اروری هست که شما باید تریس کنید ببینید چه آبجکتی نال هست . روی خطی که ارور دارید F9 بزنید سپس اجرا کنید و قتی به اون خط رسید ببینید چه آبجکتی نال هست

mr.sirwan
سه شنبه 05 دی 1396, 10:59 صبح
شما باید توی ایونت کلیک btnAddGroupUser_Click ابجکت databasecontext که توی کد شما همون MyDB هستش رو بعد از try نیو کنین که اینکارو نکردین

a.golzar66
پنج شنبه 07 دی 1396, 08:28 صبح
دوست عزیز اگر مشکلت با راه حل دوستان حل نشد بگید

kamran_14
پنج شنبه 07 دی 1396, 10:32 صبح
دوست عزیز اگر مشکلت حل با راه حل دوستان حل نشد بگید
سلام
حل نشد
من قبلا اون رو درست کرده بودم یعنی داخل try نیوش کرده بودم اما حل نشد

a.golzar66
پنج شنبه 07 دی 1396, 11:32 صبح
کلاس های group و user و myDB رو قبل عنوان کلاس یه کلمه public بزار ببین درست میشه

raha raad
شنبه 09 دی 1396, 10:29 صبح
سلام. چرا از junction استفاده نکردید؟؟!!

kamran_14
دوشنبه 11 دی 1396, 08:02 صبح
کلاس های group و user و myDB رو قبل عنوان کلاس یه کلمه public بزار ببین درست میشه










مرسی مشکلم با این روش حل شد.