PDA

View Full Version : تغییر نام ForeignKey در Entity Code-First



PrinceDotNet
دوشنبه 02 مرداد 1391, 05:09 صبح
با سلام
در پروژه من 1 مدل با دیگری رابطه ی 1:many داره که مدل 1 دارای 4 ستون Key هستش که طبعا 4 , Foreign Key در مدل many ایحاد می کنه. می خوام بدونم چطور میشه نام ForeignKey هارو عوض کرد؟
ممنون

mze666
دوشنبه 02 مرداد 1391, 10:29 صبح
سلام - دوتا راه داره یکی این که از Attribute ای به نام [ForeignKey("")] استفاده کنید. یه راه دیگشم اینه که یه کلاس مجزا بسازید که از EntityTypeConfiguration<YourEntity> مشتق میشه و توی اون کد زیر رو بنویسید:

this.HasMany<Invoice>(x => x.Invoices).WithRequired(x => x.Customer).HasForeignKey(x => x.CustomerId).WillCascadeOnDelete(false);

و بعدش توی کلاس Context تون توی OnModelCreating هم خط زیر رو بنویسید:

modelBuilder.Configurations.Add(new CustomerConfiguration());
موفق باشید.

PrinceDotNet
دوشنبه 02 مرداد 1391, 11:04 صبح
مثال Attribute شو میشه واسه من بگید؟

این کد من هستش. چه تغییری باید بدم؟



public class PersonelInfo
{

[Key, Column("NPerId", Order = 0)]
public int ID { get; set; }

[Key, Column("NYear", Order = 1)]
public int Year { get; set; }

[Key, Column("SMonth", Order = 2)]
public string Month { get; set; }

[Key, Column("NType", Order = 3)]
public int Type { get; set; }

[Required]
[MaxLength(50)]
public string Name { get; set; }

[MaxLength(50)]
public string FatherName { get; set; }

public int AccuntNumber { get; set; }

[MaxLength(50)]
public string BankName { get; set; }

public virtual ICollection<Odment> Odments { get; set; }
public virtual ICollection<Debit> Debits { get; set; }
public virtual ICollection<Premium> Premiums { get; set; }
}

mze666
دوشنبه 02 مرداد 1391, 13:17 عصر
سلام - دوست عزیز شما باید کلاس Debitیا Odmentو ... رو میذاشتید!
به هر حال، توی کلاس Debit شما حتما دوتا پروپرتی دارید که به صورت زیر هستن:

public int PersonelInfoID { get; set; }
public PersonelInfo PersonelInfo { get; set; }

حالا شما باید بالای این پروپرتی دوم (PersonelInfo) بنویسید:
[ForeignKey("PersonelInfoID")]

PrinceDotNet
سه شنبه 03 مرداد 1391, 00:32 صبح
این مدل Debit هستش :



namespace MvcPayRoll.Models
{
public class Debit
{
[Key, Column("NDebCode" ,Order = 0)]
public int ID { get; set; }

[Column("NDebValue")]
public int DebitValue { get; set; }

[Column("NDebRemain")]
public int DebitRemain { get; set; }

[Column("SDebName")]
public string DebitName { get; set; }

public virtual PersonelInfo PersonelInfo { get; set; }
}
}


چه تغییری باید کجا بدم؟

mze666
سه شنبه 03 مرداد 1391, 04:04 صبح
خوب این مدل شما غلطه چون اصلا یه پروپرتی int که PersonelInfoID باشه رو نداره. شما این پروپرتی زیر رو اضافه کنید:
public int PersonelInfoID { get; set; }

بعد بالای اون خط آخر (پروپرتی virtual PersonelInfo) این رو قرار بدید:
[ForeignKey("PersonelInfoID")]

PrinceDotNet
چهارشنبه 04 مرداد 1391, 14:43 عصر
خوب 3 تا کلید دیگه هم داره! واسه اونا چیکا باید کرد؟

mze666
چهارشنبه 04 مرداد 1391, 15:01 عصر
دوست عزیز روش کار همینه. شما توی کلاس Odment و Premium هم دقیقا همون کدی که توی پست قبلی گذاشتم رو باید بنویسید.

PrinceDotNet
پنج شنبه 05 مرداد 1391, 00:02 صبح
عزیز شما کد PersonalInfo رو ببین! 4 تا کلید هستش! یعنی توی هر کدوم باید قبل Virtual PersonalInfo از 4 تا ForeignKey استفاده کنم؟ مشکل من اینه که 1 کلید ندارم!