ورود

View Full Version : چگونگی مقداردهی به کلید خارجی در متد سید؟



پروگرامنویس
پنج شنبه 02 شهریور 1396, 18:54 عصر
روز خوش
دو تا ان.تی.تی مدل دارم بنام منو و سابمنو که نسبت بهم رابطه یک به چند دارند.میخوام زمان ساخت پایگاه داده با متد سید بهشون مقدار اولیه بدم.
پراپرتی ارتباطی مدل Menu با submenu


public virtual List<SubMenu> Sub { get; set; }

پراپرتی های ارتباطی مدل submenu با mnu


public int MenuId { get; set; }
public virtual Menu Menu { get; set; }

تو متد سید بعد مقداردهی به جدول منو ،چگونه باید به کلید خارجی MeniId در SubMenu مقدار ارتباط دهنده رو بدم؟


//////01-Menus
context.Menus.Add(
new Models.Menu
{
NameMenu = "نرم افزار",
Type = "n",
UrlMenu = "sw",
Ordr = "1",
Icon = "fa fa-home",
Sub = new System.Collections.Generic.List<Models.SubMenu>
{
new Models.SubMenu
{
NameSub="نودادها", Ordr="1", UrlSub="news",
},
}
}
);

Moien Tajik
پنج شنبه 02 شهریور 1396, 20:13 عصر
اول باید Menu رو ادد کنید ، بعد آیدی اولین رکورد ( یا طبق شرطی از خودتون ) ، اون آیدی رو برای Submenu قرار بدید .

دلیل اینکه مستقیم مثلا 1 رو بعنوان آیدی برای Submenu بصورت Static قرار نباید بدید این هست که ممکن شما Migration رو Revert کنید و یا Menu که آیدی شماره 1 داره رو پاک کنید که در این صورت دیگه رکوردی با آیدی شماره 1 نخواهید داشت و Order شما بهم خواهد خورد ;
این فیلد چون در دیتابیس primary key هست و identity پس فقط 1 رکورد با اون آیدی وجود خواهد داشت که اگر حذق بشه و اون رو برای Submenu بصورت پیشفرض قرار بدید به مشکل میخورید چون دیگه Menu ای با اون ID وجود نداره و شما سعی دارید منویی که وجود نداره رو بعنوان Foreign Key قرار بدید .

با این تفاسیر :

Menu firstMenu = new Menu
{
// Your Model Data Initizalization
Name = "Menu1",
};


db.Menus.Add(firstMenu);
db.SaveChanges();




int menuID = db.Menus.FirstOrDefault(r => r.Name.Equals("Menu1")).ID;


Submenu mySubmenu = new Submenu
{
// Your SubModel Data Initizalization
ID = menuID,

}


db.Submenu.Add(mySubmenu);
db.SaveChanges();


http://mdpopescu.blogspot.it/2013/06/ef-code-first-seeding-with-foreign-keys.html

پروگرامنویس
جمعه 03 شهریور 1396, 18:39 عصر
سپاس /کاری که گفتید رو انجام دادم اما با یه مشکل تازه روبرو شدم.الان دیگه اصلا کلاس SetInitializer که توش متد سید رو نوشتم اجرا نمشه درنتیجه دیتابس هم کلا دیگه ساخته نمیشه!وقتی برک پوینت میزارم اول SiteContext بعد اکشن و ویو ایندکس اجرا میشه و کلاسی که توش متد سید رو تعریف کردم رو نادیده میگیره.نمی دونم چرا اینجوری شد!
دیتابیس مدل:


public class SiteContext : DbContext
{
static SiteContext()
{
System.Data.Entity.Database.SetInitializer<SiteContext>(
new SiteContextInitial());
}
public SiteContext()
{
}
//ان.تی.تی ها...

کلاس ست اینشیالزری که توش متد سید هم هست :


public class SiteContextInitial : //System.Data.Entity.DropCreateDatabaseAlways<SiteContext>
System.Data.Entity.DropCreateDatabaseIfModelChange s<SiteContext>
{
public SiteContextInitial()
{

}
protected override void Seed(SiteContext context)
{
// ...
}

Moien Tajik
جمعه 03 شهریور 1396, 20:58 عصر
مشکل شما از جای دیگه باید باشه چون کدهایی که براتون فرستادم داخل Seed باید بزارید و ربطی به بقیه نداره .

اگر از Automatic Migration استفاده میکنید ، میتونید در Global.asax به این شکل عمل کنید و داخل Seed اش عملیاتتون رو انجام بدید :

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.F ilters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
/* Add this line */Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, MigrationConfig>());
}


// Add this method
public class MigrationConfig : DbMigrationsConfiguration<ApplicationDbContext>
{
public MigrationConfig()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}


protected override void Seed(ApplicationDbContext context)
{
}
}
}


اگر Automatic Migration نیست میتونید به این شکل کار کنید :
https://www.tutorialspoint.com/entity_framework/entity_framework_seed_database.htm

پروگرامنویس
شنبه 04 شهریور 1396, 12:43 عصر
اگر Automatic Migration نیست میتونید به این شکل کار کنید :
https://www.tutorialspoint.com/entit...d_database.htm (https://www.tutorialspoint.com/entity_framework/entity_framework_seed_database.htm)

بازم سپاس/من دقیقا مثه لینکی که گذاشتید عمل کردم.اما بازم پایگاه داده ساخته نمیشه.بازم برک پوینت که میزنم داخل سازنده DbContext میره اما بازم کلاس
UniDBInitializer رو نادیده میگیره و به کنترلر هوم میره و بعد خطای زیر رو میگیره که گمونم واسه اینکه جداول ساخته نشده که چیزی بخواد بارگیری کنه
اما متن خطا به کلیدهای خارجی مدلهام اشاره میکنه نمیدونم چرا؟درضمن تو مدل blog که این خطا رخ داده اتفاقا من هیچ کلید خارجی ایتعریف نکردم.

146144

Moien Tajik
شنبه 04 شهریور 1396, 14:05 عصر
یکبار دیتابیستون رو حذف کنید ، دوباره اطلاعات رو Seed کنید ، کار با Automatic Migrations خیلی هم راحتتر هستش .
یه Seed ساده نباید این همه دردسر داشته باشه !